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语法(3)
Oct 09 PHP
加强版phplib的DB类
Mar 31 PHP
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
Nov 02 PHP
基于PHP CURL获取邮箱地址的详解
Jun 03 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
Jun 28 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
Oct 25 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
常用PHP框架功能对照表
Oct 23 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
Sep 22 PHP
PHP利用imagick生成组合缩略图
Feb 19 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
Mar 19 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
Jan 16 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 数据库字段复用的基本原理与示例
2011/07/22 PHP
学习php中的正则表达式
2014/08/17 PHP
php正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
一波PHP中cURL库的常见用法代码示例
2016/05/06 PHP
PHP反射机制原理与用法详解
2017/02/15 PHP
php新建文件的方法实例
2019/09/26 PHP
jquery 学习之二 属性(html()与html(val))
2010/11/25 Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
2011/04/07 Javascript
有关Promises异步问题详解
2015/11/13 Javascript
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
在nginx上部署vue项目(history模式)的方法
2017/12/28 Javascript
JavaScript实现的滚动公告特效【基于jQuery】
2019/07/10 jQuery
JS实现移动端点击按钮复制文本内容
2019/07/28 Javascript
vue遍历生成的输入框 绑定及修改值示例
2019/10/30 Javascript
python3使用urllib示例取googletranslate(谷歌翻译)
2014/01/23 Python
python实现简单爬虫功能的示例
2016/10/24 Python
python机器学习理论与实战(五)支持向量机
2018/01/19 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
Python简单基础小程序的实例代码
2019/04/28 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
2019/08/13 Python
python判断两个序列的成员是否一样的实例代码
2020/03/01 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
2020/06/30 Python
python中upper是做什么用的
2020/07/20 Python
安踏官方商城:anta.cn
2019/12/16 全球购物
幼儿园保教管理制度
2014/02/03 职场文书
黄继光的英雄事迹材料
2014/02/13 职场文书
网络宣传方案
2014/03/15 职场文书
股权投资意向书
2014/04/01 职场文书
环保倡议书
2014/04/14 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
个人主要事迹材料
2014/08/26 职场文书
2015年教务工作总结
2015/05/23 职场文书
全陪导游词开场白
2015/05/29 职场文书
使用pycharm运行flask应用程序的详细教程
2021/06/07 Python