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 相关文章推荐
WINDOWS服务器安装多套PHP的另类解决方案
Oct 09 PHP
PHP网站备份程序代码分享
Jun 10 PHP
ecshop 2.72如何修改后台访问地址
Mar 03 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
Dec 31 PHP
简单实现php上传文件功能
Sep 21 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
Oct 19 PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 PHP
PHP使用PDO抽象层获取查询结果的方法示例
May 10 PHP
PHP实现登录验证码校验功能
May 17 PHP
PHP实现对数字分隔加千分号的方法
Mar 18 PHP
php获取小程序码的实现代码(B类接口)
Jun 13 PHP
laravel ajax curd 搜索登录判断功能的实现
Apr 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短网址和数字之间相互转换的方法
2015/03/13 PHP
php 输出json及显示json中的中文汉字详解及实例
2016/11/09 PHP
利用Laravel事件系统如何实现登录日志的记录详解
2017/05/20 PHP
PDO::setAttribute讲解
2019/01/29 PHP
JavaScript高级程序设计 阅读笔记(二十一) JavaScript中的XML
2012/09/14 Javascript
javascript中interval与setTimeOut的区别示例介绍
2014/03/14 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
JS实现简单的键盘打字的效果
2015/04/24 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
JS修改地址栏参数实例代码
2016/06/14 Javascript
jQuery Json数据格式排版高亮插件json-viewer.js使用方法详解
2017/06/12 jQuery
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
基于webpack 实用配置方法总结
2017/09/28 Javascript
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
jQuery与vue实现拖动验证码功能
2018/01/30 jQuery
原生JS实现手动轮播图效果实例代码
2018/11/22 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
python删除文件示例分享
2014/01/28 Python
Python3基础之条件与循环控制实例解析
2014/08/13 Python
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
详解Python pygame安装过程笔记
2017/06/05 Python
使用Python从零开始撸一个区块链
2018/03/14 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
Python缓存技术实现过程详解
2019/09/25 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
Python爬虫实例——爬取美团美食数据
2020/07/15 Python
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
中医临床专业自我鉴定范文
2014/01/15 职场文书
数学国培研修感言
2014/02/13 职场文书
老师的检讨书
2014/02/23 职场文书
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
java实现对Hadoop的操作
2021/07/01 Java/Android
vue 自定义组件添加原生事件
2022/04/21 Vue.js
mysql sql常用语句大全
2022/06/21 MySQL