截取字符串并保留完整xml标签的php代码

原创
2016-07-25 09:05:41 588浏览
  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核实处理。
上一条:php-redis中文文档之三 下一条:php中include()和require()的区别

相关文章

查看更多