截取字符串并保留完整xml标签的php代码
时间:2021-07-01 10:21:17
帮助过:15人阅读
- /**
- * author: goosman
- * blog: http://blog.csdn.net/lgg201
- * mail: lgg860911@yahoo.com.cn
- */
-
- $str = '01234567890120123456789';
- function substr_remain_tag($s, $o, $l) {
- $is_match = preg_match_all(<< ;
- #该正则表达式解析xml标签, 标签属性内部支持转义符"\", 支持对"\"自身和对应引号的转义
- <(\w+) #标签开始
- (?: #属性列表
- \s+ #前置空格
- \w+ #属性名
- \s* #属性名后的空白(为了兼容)
- = #属性名值之间的等号
- \s* #属性值前的空白(为了兼容)
- (?: #属性值(引号处理)
- " #双引号的情况
- (?:
- \\\\\\\\ #吃掉连续两个转义符(表示转义符自身)
- |
- \\\\" #吃掉转义符接着一个引号(表示转义的引号)
- |
- [^"\\\\]* #其他字符
- )*
- "
- |
- ' #单引号情况
- (?:
- \\\\\\\\ #吃掉连续两个转义符(表示转义符自身)
- |
- \\\\' #吃掉转义符接着一个引号(表示转义的引号)
- |
- [^'\\\\]* #其他字符
- )*
- '
- )
- )*
- >
- .*? #标签内容
- (?1)> #结束标签
- ;x
- heredoc
- , $s, $matches, PREG_OFFSET_CAPTURE, $o);
- if ( $is_match ) {
- foreach ( $matches[0] as $match ) {
- $o0 = $match[1];
- #标签左边界越过截取目标右边界, 退出
- if ( $o0 >= $o + $l ) break;
- $l0 = strlen($match[0]);
- #标签右边界在截取目标右边界内, 继续
- if ( $o0 + $l0 < $o + $l ) continue;
-
- #以下为标签跨边界处理
- $l = $o0 + $l0 - $o;
- break;
- }
- }
- return substr($s, $o, $l);
- }
- echo $str . chr(10);
- echo substr_remain_tag($str, 0, 20) . chr(10);
|