>백엔드 개발 >PHP 튜토리얼 >문자열을 가로채고 완전한 XML 태그를 유지하는 PHP 코드

문자열을 가로채고 완전한 XML 태그를 유지하는 PHP 코드

WBOY
WBOY원래의
2016-07-25 09:05:41923검색
  1. /**
  2. * author: goosman
  3. * blog: http://blog.csdn.net/lgg201
  4. * mail: lgg860911@yahoo.com.cn
  5. */
  6. $str = '01234567890120123456789';
  7. function substr_remain_tag($s, $o, $l) {
  8. $is_match = preg_match_all(<< ;
  9. #该正则表达式解析xml标签, 标签属性内部支持转义符"", 支持对""自身和对应引号的转义
  10. <(w ) #标签开始
  11. (?: #属性列表
  12. s #前置空格
  13. w #属性名
  14. s* #属性名后的空白(为了兼容)
  15. = #属性名值之间的等号
  16. s* #属性值前的空白(为了兼容)
  17. (?: #属性值(引号处理)
  18. " #双引号的情况
  19. (?:
  20. \\ #吃掉连续两个转义符(表示转义符自身)
  21. |
  22. \" #吃掉转义符接着一个引号(表示转义的引号)
  23. |
  24. [^"\]* #其他字符
  25. )*
  26. "
  27. |
  28. ' #单引号情况
  29. (?:
  30. \\ #吃掉连续两个转义符(表示转义符自身)
  31. |
  32. \' #吃掉转义符接着一个引号(表示转义的引号)
  33. |
  34. [^'\]* #其他字符
  35. )*
  36. '
  37. )
  38. )*
  39. >
  40. .*? #标签内容
  41. #结束标签
  42. ;x
  43. heredoc
  44. , $s, $matches, PREG_OFFSET_CAPTURE, $o);
  45. if ( $is_match ) {
  46. foreach ( $matches[0] as $match ) {
  47. $o0 = $match[1];
  48. #标签左边界越过截取目标右边界, 退出
  49. if ( $o0 >= $o $l ) break;
  50. $l0 = strlen($match[0]);
  51. #标签右边界在截取目标右边界内, 继续
  52. if ( $o0 $l0 < $o $l ) continue;
  53. #以下为标签跨边界处理
  54. $l = $o0 $l0 - $o;
  55. break;
  56. }
  57. }
  58. return substr($s, $o, $l);
  59. }
  60. echo $str . chr(10);
  61. echo substr_remain_tag($str, 0, 20) . chr(10);
复制代码


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.