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


Posted in PHP onFebruary 06, 2013
<?php  
    /** 
     * author: goosman 
     * blog: http://blog.csdn.net/lgg201 
     * mail: lgg860911@yahoo.com.cn 
     */      $str    = '0123456789<a>012</a>0123456789';  
    function substr_remain_tag($s, $o, $l) {  
        $is_match   = preg_match_all(<<<heredoc  
    #该正则表达式解析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);
PHP 相关文章推荐
解决phpmyadmin 乱码,支持gb2312和utf-8
Nov 20 PHP
PHP 反射机制实现动态代理的代码
Oct 22 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
Jun 19 PHP
thinkPHP中分页用法实例分析
Dec 26 PHP
PHP对称加密函数实现数据的加密解密
Oct 27 PHP
PHP使用数组实现矩阵数学运算的方法示例
May 29 PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
Jun 22 PHP
Swoole实现异步投递task任务案例详解
Apr 02 PHP
PHP设计模式之策略模式原理与用法实例分析
Apr 04 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
Oct 20 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
Aug 17 PHP
php中存储用户ID和密码到mysql数据库的方法
Feb 06 #PHP
php中使用__autoload()自动加载未定义类的实现代码
Feb 06 #PHP
php中使用preg_match_all匹配文章中的图片
Feb 06 #PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 #PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
Feb 06 #PHP
php中设置index.php文件为只读的方法
Feb 06 #PHP
php中选择什么接口(mysql、mysqli)访问mysql
Feb 06 #PHP
You might like
在PHP中利用XML技术构造远程服务(下)
2006/10/09 PHP
PHP中date()日期函数有关参数整理
2011/07/19 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
AngularJS 防止页面闪烁的方法
2017/03/09 Javascript
jQuery实现验证码功能
2017/03/17 Javascript
JavaScript实现form表单的多文件上传
2020/03/27 Javascript
js仿微信抢红包功能
2020/09/25 Javascript
angular1.x ui-route传参的三种写法小结
2018/08/31 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
python 正则式 概述及常用字符
2009/05/07 Python
python中遍历文件的3个方法
2014/09/02 Python
极简的Python入门指引
2015/04/01 Python
python检索特定内容的文本文件实例
2018/06/05 Python
机器学习实战之knn算法pandas
2019/06/22 Python
韩国演唱会订票网站:StubHub韩国
2019/01/17 全球购物
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
奥地利时尚、美容、玩具和家居之家:Kastner & Öhler
2020/04/26 全球购物
描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理
2015/03/25 面试题
《晚上的太阳》教学反思
2014/04/23 职场文书
改进作风怎么办发言材料
2014/08/17 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
企业授权委托书范本
2014/09/22 职场文书
处级干部反四风个人对照检查材料思想汇报
2014/09/27 职场文书
大学生党性分析材料
2014/12/19 职场文书
实习计划书范文
2015/01/16 职场文书
民事纠纷协议书
2016/03/23 职场文书