Maison >développement back-end >tutoriel php >截取字符串并保留完整xml标签的php代码

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

WBOY
WBOYoriginal
2016-07-25 09:05:41923parcourir
  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. (?: #属性列表
  11. \s+ #前置空格
  12. \w+ #属性名
  13. \s* #属性名后的空白(为了兼容)
  14. = #属性名值之间的等号
  15. \s* #属性值前的空白(为了兼容)
  16. (?: #属性值(引号处理)
  17. " #双引号的情况
  18. (?:
  19. \\\\\\\\ #吃掉连续两个转义符(表示转义符自身)
  20. |
  21. \\\\" #吃掉转义符接着一个引号(表示转义的引号)
  22. |
  23. [^"\\\\]* #其他字符
  24. )*
  25. "
  26. |
  27. ' #单引号情况
  28. (?:
  29. \\\\\\\\ #吃掉连续两个转义符(表示转义符自身)
  30. |
  31. \\\\' #吃掉转义符接着一个引号(表示转义的引号)
  32. |
  33. [^'\\\\]* #其他字符
  34. )*
  35. '
  36. )
  37. )*
  38. >
  39. .*? #标签内容
  40. (?1)> #结束标签
  41. ;x
  42. heredoc
  43. , $s, $matches, PREG_OFFSET_CAPTURE, $o);
  44. if ( $is_match ) {
  45. foreach ( $matches[0] as $match ) {
  46. $o0 = $match[1];
  47. #标签左边界越过截取目标右边界, 退出
  48. if ( $o0 >= $o + $l ) break;
  49. $l0 = strlen($match[0]);
  50. #标签右边界在截取目标右边界内, 继续
  51. if ( $o0 + $l0
  52. #以下为标签跨边界处理
  53. $l = $o0 + $l0 - $o;
  54. break;
  55. }
  56. }
  57. return substr($s, $o, $l);
  58. }
  59. echo $str . chr(10);
  60. echo substr_remain_tag($str, 0, 20) . chr(10);
复制代码


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn