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实现jQuery扩展函数
Oct 30 PHP
php ftp文件上传函数(基础版)
Jun 03 PHP
《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
Nov 01 PHP
php中的boolean(布尔)类型详解
Oct 28 PHP
PHP+memcache实现消息队列案例分享
May 21 PHP
php购物车实现方法
Jan 03 PHP
PHP往XML中添加节点的方法
Mar 12 PHP
PHP中你应该知道的require()文件包含的正确用法
Jun 12 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
Mar 02 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
Aug 31 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
Jul 17 PHP
PHP设计模式之组合模式定义与应用示例
Feb 01 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和mysql中uft-8中文编码乱码的几种解决办法
2012/04/19 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
javascript showModalDialog,open取得父窗口的方法
2010/03/10 Javascript
让浏览器非阻塞加载javascript的几种方法小结
2011/04/25 Javascript
JavaScript中的style.display属性操作
2013/03/27 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
关于JSON与JSONP简单总结
2016/08/16 Javascript
js中apply与call简单用法详解
2017/11/06 Javascript
JavaScript基于面向对象实现的猜拳游戏
2018/01/03 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
js实现滑动滑块验证登录
2020/07/24 Javascript
[01:02:17]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG
2014/05/26 DOTA
[00:35]可解锁地面特效
2018/12/20 DOTA
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
python sys.argv[]用法实例详解
2018/05/25 Python
PyQt5实现QLineEdit添加clicked信号的方法
2019/06/25 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
python 星号(*)的多种用途
2020/09/21 Python
NFL墨西哥官方商店:Tienda NFL
2017/11/28 全球购物
猫咪家具:CatsPlay
2018/11/03 全球购物
校运会广播稿100字
2014/01/27 职场文书
贷款委托书范本
2014/04/08 职场文书
《假如》教学反思
2014/04/17 职场文书
社区志愿者活动总结
2014/06/26 职场文书
群众路线调研报告范文
2014/11/03 职场文书
八一建军节慰问信
2015/02/14 职场文书
大学生支教感言
2015/08/01 职场文书
汉语拼音教学反思
2016/02/22 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
Vue全家桶入门基础教程
2021/05/14 Vue.js
Django对接elasticsearch实现全文检索的示例代码
2021/08/02 Python
oracle重置序列从0开始递增1
2022/02/28 Oracle
Python中np.random.randint()参数详解及用法实例
2022/09/23 Python