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侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
Oct 15 PHP
PHP写的求多项式导数的函数代码
Jul 04 PHP
php mysql_real_escape_string函数用法与实例教程
Sep 30 PHP
PHP闭包函数详解
Feb 13 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
Feb 26 PHP
WordPress中设置Post Type自定义文章类型的实例教程
May 10 PHP
curl 出现错误的调试方法(必看)
Feb 13 PHP
php对xml文件的增删改查操作实现方法分析
May 19 PHP
php判断电子邮件是否正确方法
Dec 04 PHP
php原生数据库分页的代码实例
Feb 18 PHP
php设计模式之单例模式用法经典示例分析
Sep 20 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
Mar 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
为什么《星际争霸》是测试人工智能的理想战场
2019/12/03 星际争霸
极典R601SW收音机
2021/03/02 无线电
phpMyAdmin 安装及问题总结
2009/05/28 PHP
PHP版 汉字转码的实现详解
2013/06/09 PHP
PHP7+Nginx的配置与安装教程详解
2016/05/10 PHP
一个简单的javascript类定义例子
2009/09/12 Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
jquery post方式传递多个参数值后台以数组的方式进行接收
2013/01/11 Javascript
js过滤HTML标签以及空格的思路及代码
2013/05/24 Javascript
cookie.js 加载顺序问题怎么才有效
2013/07/31 Javascript
js简单实现HTML标签Select联动带跳转
2013/10/23 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
JS小游戏之象棋暗棋源码详解
2014/09/25 Javascript
JavaScript自定义等待wait函数实例分析
2015/03/23 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
ionic js 模型 $ionicModal 可以遮住用户主界面的内容框
2016/06/06 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
浅谈angularjs module返回对象的坑(推荐)
2016/10/21 Javascript
详解js的六大数据类型
2016/12/27 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
2017/04/24 Javascript
vue学习笔记之v-if和v-show的区别
2017/09/20 Javascript
详解django的serializer序列化model几种方法
2018/10/16 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
pycharm 将python文件打包为exe格式的方法
2019/01/16 Python
Python3中的bytes和str类型详解
2019/05/02 Python
Python3.6 中的pyinstaller安装和使用教程
2020/03/16 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
合作意向书格式及范文
2014/03/31 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
《用字母表示数》教学反思
2016/02/17 职场文书
2019通用版新员工入职培训方案!
2019/07/11 职场文书
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server
Python torch.flatten()函数案例详解
2021/08/30 Python
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL