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 相关文章推荐
Discuz! Passport 通行证整合
Mar 27 PHP
phpmyadmin MySQL 加密配置方法
Jul 05 PHP
《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
Nov 01 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
Jun 26 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
Nov 19 PHP
php实现通用的从数据库表读取数据到数组的函数实例
Mar 21 PHP
刷新PHP缓冲区为你的站点加速
Oct 10 PHP
PHP中session跨子域的三种实现方法
Jul 25 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
laravel实现上传图片的两种方式小结
Oct 12 PHP
Yii 框架使用Forms操作详解
May 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
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
php导出word文档与excel电子表格的简单示例代码
2014/03/08 PHP
PHP+mysql实现的三级联动菜单功能示例
2019/02/15 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
JS获取IP、MAC和主机名的五种方法
2013/11/14 Javascript
showModalDialog模态对话框的使用详解以及浏览器兼容
2014/01/11 Javascript
Javascript 按位与运算符 (&amp;)使用介绍
2014/02/04 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
2016/05/25 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
JQ中$(window).load和$(document).ready区别与执行顺序
2017/03/01 Javascript
JavaScript实现隐藏省略文字效果的方法
2017/04/27 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
2017/11/08 jQuery
关于JavaScript 数组你应该知道的事情(推荐)
2019/04/10 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
jQuery HTML css()方法与css类实例详解
2020/05/20 jQuery
微信小程序学习之自定义滚动弹窗
2020/12/20 Javascript
在Python的while循环中使用else以及循环嵌套的用法
2015/10/14 Python
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
Python爬虫中urllib库的进阶学习
2018/01/05 Python
Django中的文件的上传的几种方式
2018/07/23 Python
使用 Python 实现微信群友统计器的思路详解
2018/09/26 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
html5实现滑块功能之type=&quot;range&quot;属性
2020/02/18 HTML / CSS
蛋糕店创业计划书
2014/05/06 职场文书
教师个人自我剖析材料
2014/09/29 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书
JavaScript实现复选框全选功能
2021/04/11 Javascript
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技
使用CSS实现百叶窗效果示例代码
2023/05/07 HTML / CSS