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 相关文章推荐
PHP+SQL 注入攻击的技术实现以及预防办法
Jan 27 PHP
基于PHP文件操作的详细诠释
Jun 21 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
Jun 29 PHP
PHP模板解析类实例
Jul 09 PHP
常见PHP数据库解决方案分析介绍
Sep 24 PHP
WordPress分页伪静态加html后缀
Jun 08 PHP
php基于自定义函数记录log日志方法
Jul 21 PHP
PHP将数据导出Excel表中的实例(投机型)
Jul 31 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
Oct 23 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
php实现微信支付之现金红包
May 30 PHP
php7 参数、整形及字符串处理机制修改实例分析
May 25 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
CakePHP框架Session设置方法分析
2017/02/23 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
JavaScript与函数式编程解释
2007/04/27 Javascript
jquery 双色表格实现代码
2009/12/08 Javascript
node.js中的path.extname方法使用说明
2014/12/09 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
JavaScript 实现 Tab 点击切换实例代码
2017/03/25 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
React Router v4 入坑指南(小结)
2018/04/08 Javascript
react-native动态切换tab组件的方法
2018/07/07 Javascript
在Create React App中启用Sass和Less的方法示例
2019/01/16 Javascript
简单了解TypeScript中如何继承 Error 类
2019/06/21 Javascript
JS轮播图的实现方法2
2020/08/25 Javascript
Python天气预报采集器实现代码(网页爬虫)
2012/10/07 Python
python修改字典内key对应值的方法
2015/07/11 Python
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
Python中new方法的详解
2019/01/15 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
2019/02/25 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
django ORM之values和annotate使用详解
2020/05/19 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
什么是SQL Server的确定性函数和不确定性函数
2016/08/04 面试题
什么是.net的Remoting技术
2016/07/08 面试题
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2014/01/19 面试题
音乐专业自荐信
2014/02/07 职场文书
2014年体育工作总结
2014/11/24 职场文书
求职简历自我评价2015
2015/03/10 职场文书
2019年入党思想汇报
2019/03/25 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python
html css3不拉伸图片显示效果
2021/06/07 HTML / CSS
AJAX实现省市县三级联动效果
2021/10/16 Javascript
Python实现提取PDF简历信息并存入Excel
2022/04/02 Python
CentOS7安装MySQL8的超级详细教程(无坑!)
2022/06/10 Servers