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的FTP学习(二)
Oct 09 PHP
PHP新手上路(十二)
Oct 09 PHP
php入门教程 精简版
Dec 13 PHP
php随机输出名人名言的代码
Oct 07 PHP
学习php分页代码实例
Oct 24 PHP
php防止伪造数据从地址栏URL提交的方法
Aug 24 PHP
PHP实现Soap通讯的方法
Nov 03 PHP
php数组查找函数总结
Nov 18 PHP
PHP中imagick函数的中文解释
Jan 21 PHP
PHP实现通过CURL上传文件功能示例
May 30 PHP
PHP时间戳和日期相互转换操作实例小结
Dec 18 PHP
PHP中有关长整数的一些操作教程
Sep 11 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/31 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
ext前台接收action传过来的json数据示例
2014/06/17 Javascript
javascript实现禁止鼠标滚轮事件
2015/07/24 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
2016/01/09 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
总结几道关于Node.js的面试问题
2017/01/11 Javascript
js实现无缝滚动图(可控制当前滚动的方向)
2017/02/22 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
angular 表单验证器验证的同时限制输入的实现
2019/04/11 Javascript
Vue 实现从小到大的横向滑动效果详解
2019/10/16 Javascript
prettier自动格式化去换行的实现代码
2020/08/25 Javascript
Pytorch 实现自定义参数层的例子
2019/08/17 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
python读取多层嵌套文件夹中的文件实例
2020/02/27 Python
通过python 执行 nohup 不生效的解决
2020/04/16 Python
HTML5之SVG 2D入门7—SVG元素的重用与引用
2013/01/30 HTML / CSS
MATCHESFASHION.COM法国官网:英国奢侈品零售商
2018/01/04 全球购物
股权收购意向书
2014/04/01 职场文书
学校先进集体事迹材料
2014/05/31 职场文书
金融管理专业求职信
2014/07/10 职场文书
反对四风自我剖析材料
2014/10/07 职场文书
异地恋情人节寄语
2015/02/28 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
win11高清晰音频管理器在哪里?win11找不到高清晰音频管理器解决办法
2022/04/08 数码科技
mysql sql常用语句大全
2022/06/21 MySQL
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技