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 相关文章推荐
15个小时----从修改程序到自己些程序
Oct 09 PHP
用PHP实现读取和编写XML DOM代码
Apr 07 PHP
php 解决旧系统 查出所有数据分页的类
Aug 27 PHP
php mssql扩展SQL查询中文字段名解决方法
Oct 15 PHP
解析数组非数字键名引号的必要性
Aug 09 PHP
php foreach循环中使用引用的问题
Nov 06 PHP
PHP实现操作redis的封装类完整实例
Nov 14 PHP
php实现的一段简单概率相关代码
May 30 PHP
利用PHP获取汉字首字母并且分组排序详解
Oct 22 PHP
PHP实现的支付宝支付功能示例
Mar 26 PHP
Laravel-admin之修改操作日志的方法
Sep 30 PHP
thinkphp 框架数据库切换实现方法分析
May 18 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
浅析Apache中RewriteCond规则参数的详细介绍
2013/06/30 PHP
laravel安装和配置教程
2014/10/29 PHP
php.ini中date.timezone设置详解
2016/11/20 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
2017/03/31 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
Javascript的严格模式strict mode详细介绍
2014/06/06 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
12个非常实用的JavaScript小技巧【推荐】
2016/05/18 Javascript
AngularJS中transclude用法详解
2016/11/03 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
2016/12/19 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
微信小程序自动客服功能
2017/11/02 Javascript
JS实现字符串中去除指定子字符串方法分析
2018/05/17 Javascript
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
六种酷炫Python运行进度条效果的实现代码
2020/07/17 Python
Python 代码调试技巧示例代码
2020/08/11 Python
Python容器类型公共方法总结
2020/08/19 Python
纯CSS3实现的阴影效果
2014/12/24 HTML / CSS
Tiqets英国:智能手机上的文化和娱乐门票
2019/07/10 全球购物
泰国在线书店:SE-ED
2020/06/21 全球购物
清华大学自主招生自荐信
2014/01/29 职场文书
12月小学生校园广播稿
2014/02/04 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
采购意向书范本
2014/03/31 职场文书
厨房领班竞聘演讲稿
2014/04/23 职场文书
财务管理专业求职信
2014/06/11 职场文书
放飞理想演讲稿
2014/09/09 职场文书
导游词之无锡东林书院
2019/12/11 职场文书
Python使用MapReduce进行简单的销售统计
2022/04/22 Python