PHP cdata 处理(详细介绍)


Posted in PHP onJuly 05, 2013

当时在网上找了一个CDATA的转换器, 修改之后, 将CDATA标签给过滤掉。如下

 // States:
        //
        //     'out'
        //     '<'
        //     '<!'
        //     '<!['
        //     '<![C'
        //     '<![CD'
        //     '<![CDAT'
        //     '<![CDATA'
        //     'in'
        //     ']'
        //     ']]'
        //
        // (Yes, the states a represented by strings.) 
        //
        $state = 'out';
        $a = str_split($xml);
        $new_xml = '';
        foreach ($a AS $k => $v) {
            // Deal with "state".
            switch ( $state ) {
                case 'out':
                    if ( '<' == $v ) {
                        $state = $v;
                    } else {
                        $new_xml .= $v;
                    }
                break;
                case '<':
                    if ( '!' == $v  ) {
                        $state = $state . $v;
                    } else {
                        $new_xml .= $state . $v;
                        $state = 'out';
                    }
                break;
                 case '<!':
                    if ( '[' == $v  ) {
                        $state = $state . $v;
                    } else {
                        $new_xml .= $state . $v;
                        $state = 'out';
                    }
                break;
                case '<![':
                    if ( 'C' == $v  ) {
                        $state = $state . $v;
                    } else {
                        $new_xml .= $state . $v;
                        $state = 'out';
                    }
                break;
                case '<![C':
                    if ( 'D' == $v  ) {
                        $state = $state . $v;
                    } else {
                        $new_xml .= $state . $v;
                        $state = 'out';
                    }
                break;
                case '<![CD':
                    if ( 'A' == $v  ) {
                        $state = $state . $v;
                    } else {
                        $new_xml .= $state . $v;
                        $state = 'out';
                    }
                break;
                case '<![CDA':
                    if ( 'T' == $v  ) {
                        $state = $state . $v;
                    } else {
                        $new_xml .= $state . $v;
                        $state = 'out';
                    }
                break;
                case '<![CDAT':
                    if ( 'A' == $v  ) {
                        $state = $state . $v;
                    } else {
                        $new_xml .= $state . $v;
                        $state = 'out';
                    }
                break;
                case '<![CDATA':
                    if ( '[' == $v  ) {
                        $cdata = '';
                        $state = 'in';
                    } else {
                        $new_xml .= $state . $v;
                        $state = 'out';
                    }
                break;
                case 'in':
                    if ( ']' == $v ) {
                        $state = $v;
                    } else {
                        $cdata .= $v;
                    }
                break;
                case ']':
                    if (  ']' == $v  ) {
                        $state = $state . $v;
                    } else {
                        $cdata .= $state . $v;
                        $state = 'in';
                    }
                break;
                case ']]':
   if (  '>' == $v  ) {
    $new_xml .= htmlentities($cdata);
#       $new_xml.= $cdata;
//                        $new_xml .= str_replace('>','>',
  //                                  str_replace('>','<',
    //                                str_replace('"','"',
      //                              str_replace('&','&',
        //                            $cdata))));
                        $state = 'out';
                    } else {
                        $cdata .= $state . $v;
                        $state = 'in';
                    }
                break;
            } // switch
        }
        //
        // Return.
        //
            return $new_xml;

最近发现,总是有alert发出来, 说是simplexml解析出错。

发现是原来有xml的数据是<![CDATA[domain[test]]] >. 出现了连续的3个], 造成上面的解析函数不能处理。

而且这个问题很难修正, 你不知道下次会不会有4, 5个]出现。

所以决定还是将这段解析 的代码换成DOM XML,本身 DOM的处理还是比较简单的,

包含DOMElement, DOMDocument, DOMNodeList, DOMNode几个 component.

对于 DOMNode有nodeValue, nodeType, nodeName的成员函数。

首先先用loadXML将string转化为DOMDocument对像, 再用getElementsByTagName转化为DOMNodeList对像, 再使用->item(0)转化为DOMNOde, 然后就可以使用上面的三种方法了。

对于 <aa color='red'>test</aa>这种xml标签, 要使用 attribute函数。

PHP 相关文章推荐
Mysql数据库操作类( 1127版,提供源码下载 )
Dec 02 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
Jun 25 PHP
php多文件上传下载示例分享
Feb 20 PHP
ThinkPHP处理Ajax返回的方法
Nov 22 PHP
以文件形式缓存php变量的方法
Jun 26 PHP
thinkphp利用模型通用数据编辑添加和删除的实例代码
Nov 20 PHP
jQuery+php简单实现全选删除的方法
Nov 28 PHP
PHP+Ajax无刷新带进度条图片上传示例
Feb 08 PHP
PHP用函数嵌入网站访问量计数器
Oct 27 PHP
PHP getDocNamespaces()函数讲解
Feb 03 PHP
php使用socket调用http和smtp协议实例小结
Jul 26 PHP
laravel 判断查询数据库返回值的例子
Oct 11 PHP
PHP的基本常识小结
Jul 05 #PHP
深入解析fsockopen与pfsockopen的区别
Jul 05 #PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
Jul 05 #PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 #PHP
php记录代码执行时间(实现代码)
Jul 05 #PHP
如何修改和添加Apache的默认站点目录
Jul 05 #PHP
解析php类的注册与自动加载
Jul 05 #PHP
You might like
PHP.MVC的模板标签系统(二)
2006/09/05 PHP
将文件夹压缩成zip文件的php代码
2009/12/14 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
Laravel 5+ .env环境配置文件详解
2020/04/06 PHP
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
jQuery判断iframe中元素是否存在的方法
2013/05/11 Javascript
谈谈impress.js初步理解
2015/09/09 Javascript
jquery 全选、全不选、反选效果的实现代码【推荐】
2016/05/05 Javascript
JS 实现 ajax 异步浏览器兼容问题
2017/01/21 Javascript
jQuery插件autocomplete使用详解
2017/02/04 Javascript
js放到head中失效的原因与解决方法
2017/03/07 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
vue form check 表单验证的实现代码
2018/12/09 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
JS canvas实现画板和签字板功能
2021/02/23 Javascript
Python set集合类型操作总结
2014/11/07 Python
解决python3 网络请求路径包含中文的问题
2018/05/10 Python
Python企业编码生成系统之系统主要函数设计详解
2019/07/26 Python
python实现输入任意一个大写字母生成金字塔的示例
2019/10/27 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
tensorflow中tf.reduce_mean函数的使用
2020/04/19 Python
在Keras中CNN联合LSTM进行分类实例
2020/06/29 Python
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
Speedo速比涛中国官方网站:全球领先泳装运动品牌
2018/04/24 全球购物
Vero Moda西班牙官方购物网站:丹麦BESTSELLER旗下知名女装品牌
2018/04/27 全球购物
党员创先争优承诺书
2014/03/26 职场文书
护士求职自荐信范文
2015/03/04 职场文书
小学教师工作总结2015
2015/04/07 职场文书
redis限流的实际应用
2021/04/24 Redis
python之json文件转xml文件案例讲解
2021/08/07 Python
Win11 BitLocker 驱动器加密
2022/04/19 数码科技
正则表达式基础与常用验证表达式
2022/06/16 Javascript