首頁  >  文章  >  後端開發  >  截取字串並保留完整xml標籤的php程式碼

截取字串並保留完整xml標籤的php程式碼

WBOY
WBOY原創
2016-07-25 09:05:41885瀏覽
  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