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将数据库中所有内容生成静态html文档的代码
Apr 12 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
May 15 PHP
基于Linux调试工具strace与gdb的常用命令总结
Jun 03 PHP
php缩放gif和png图透明背景变成黑色的解决方法
Oct 14 PHP
PHP获取数组最后一个值的2种方法
Jan 21 PHP
PHP基于yii框架实现生成ICO图标
Nov 13 PHP
通过PHP简单实例介绍文件上传
Dec 16 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
May 31 PHP
thinkPHP框架实现的无限回复评论功能示例
Jun 09 PHP
laravel 字段格式化 modle 字段类型转换方法
Sep 30 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
Oct 21 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
Smarty Foreach 使用说明
2010/03/23 PHP
php开启安全模式后禁用的函数集合
2011/06/26 PHP
新手菜鸟必读:session与cookie的区别
2013/08/22 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
PHP程序员的技术成长规划
2016/03/25 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
php实现用户注册密码的crypt加密
2017/06/08 PHP
PHP xpath提取网页数据内容代码解析
2020/07/16 PHP
html下载本地
2006/06/19 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
多个jQuery版本共存的处理方案
2015/03/17 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
AngularJS入门教程之表格实例详解
2016/07/27 Javascript
ES6正则的扩展实例详解
2017/04/25 Javascript
socket.io与pm2(cluster)集群搭配的解决方案
2017/06/02 Javascript
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
2019/11/06 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
简单了解OpenCV是个什么东西
2017/11/10 Python
使用 Python 实现微信公众号粉丝迁移流程
2018/01/03 Python
使用python为mysql实现restful接口
2018/01/05 Python
kali中python版本的切换方法
2019/07/11 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
Lands’ End官网:经典的美国生活方式品牌
2016/08/14 全球购物
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
德国领先的大尺码和超大尺码男装在线零售商:Bigtex
2019/06/22 全球购物
链表面试题-一个链表的结点结构
2015/05/04 面试题
现金出纳岗位职责
2014/03/15 职场文书
精彩的演讲稿开头
2014/05/08 职场文书
离职证明格式样本
2015/06/12 职场文书
网络舆情信息简报
2015/07/21 职场文书
《辉夜大小姐想让我告白》第三季正式预告
2022/03/20 日漫
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL
keepalived + nginx 实现高可用方案
2022/12/24 Servers