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 相关文章推荐
使用php4加速网络传输
Oct 09 PHP
PHP生成网页快照 不用COM不用扩展.
Feb 11 PHP
来自phpguru得Php Cache类源码
Apr 15 PHP
php从数组中随机抽取一些元素的代码
Nov 05 PHP
php一次性删除前台checkbox多选内容的方法
Sep 22 PHP
深入浅析用PHP实现MVC
Mar 02 PHP
php编程每天必学之验证码
Mar 03 PHP
Zend Framework教程之配置文件application.ini解析
Mar 10 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
Aug 02 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
PHP绕过open_basedir限制操作文件的方法
Jun 10 PHP
thinkphp5框架扩展redis类方法示例
May 06 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中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
php计划任务之ignore_user_abort函数实现方法
2015/01/08 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
Textarea根据内容自适应高度
2013/10/28 Javascript
jQuery寻找n以内完全数的方法
2015/06/24 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
2015/10/23 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
ajax在兼容模式下失效的快速解决方法
2016/03/22 Javascript
jQuery添加和删除输入文本框标签代码
2016/05/20 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
2016/05/31 Javascript
微信小程序 教程之模块化
2016/10/17 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
jQuery用noConflict代替$的实现方法
2017/04/12 jQuery
浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预
2017/06/25 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
2017/09/30 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
[48:00]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第二场 11.04
2020/11/04 DOTA
python多线程操作实例
2014/11/21 Python
python实现爬虫统计学校BBS男女比例(一)
2015/12/31 Python
一步步解析Python斗牛游戏的概率
2016/02/12 Python
python3中的md5加密实例
2018/05/29 Python
在python中利用opencv简单做图片比对的方法
2019/01/24 Python
Python微医挂号网医生数据抓取
2019/01/24 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
python opencv minAreaRect 生成最小外接矩形的方法
2019/07/01 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
大学本科毕业生求职信范文
2013/12/18 职场文书
商务英语专业求职信范文
2014/01/28 职场文书
大学军训感言800字
2014/02/27 职场文书
2014年五四青年节活动方案
2014/03/29 职场文书
写给导师的自荐信
2015/03/06 职场文书
中学推普周活动总结
2015/05/07 职场文书
4种方法python批量修改替换列表中元素
2022/04/07 Python