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 相关文章推荐
PHP 采集程序原理分析篇
Mar 05 PHP
PHP开发中常用的字符串操作函数
Feb 08 PHP
php实现上传图片生成缩略图示例
Apr 13 PHP
php递归json类实例
Dec 02 PHP
php读取csv数据保存到数组的方法
Jan 03 PHP
解读PHP中的垃圾回收机制
Aug 10 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
Dec 25 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
Dec 28 PHP
PHP常用设计模式之委托设计模式
Feb 13 PHP
ThinkPHP中session函数详解
Sep 14 PHP
PHP静态成员变量
Feb 14 PHP
php-fpm服务启动脚本的方法
Apr 27 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 日期加减的类,很不错
2009/10/10 PHP
PHP 显示客户端IP与服务器IP的代码
2010/10/12 PHP
注意:php5.4删除了session_unregister函数
2013/08/05 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
2016/03/17 PHP
Yii实现微信公众号场景二维码的方法实例
2020/08/30 PHP
利用javascript中的call实现继承
2007/01/22 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
解析微信JS-SDK配置授权,实现分享接口
2016/12/09 Javascript
vue2 自定义动态组件所遇到的问题
2017/06/08 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
TypeScript开发Node.js程序的方法
2019/04/30 Javascript
Python中几个比较常见的名词解释
2015/07/04 Python
Python3 处理JSON的实例详解
2017/10/29 Python
django项目运行因中文而乱码报错的几种情况解决
2017/11/07 Python
python实现验证码识别功能
2018/06/07 Python
Python GUI布局尺寸适配方法
2018/10/11 Python
python3学生名片管理v2.0版
2018/11/29 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
2019/07/30 Python
python+pygame实现坦克大战
2019/09/10 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
科颜氏加拿大官方网站: Kiehl’s加拿大
2016/08/16 全球购物
REISS英国官网:伦敦High Street最受欢迎品牌
2016/12/21 全球购物
大学秋游活动方案
2014/02/11 职场文书
优秀团队获奖感言
2014/02/19 职场文书
生产部厂长助理职位说明书
2014/03/03 职场文书
贸易跟单员英文求职信
2014/04/19 职场文书
学校施工安全责任书
2015/01/29 职场文书
联谊活动总结范文
2015/05/09 职场文书
2015年机关作风和效能建设工作总结
2015/07/23 职场文书
小学安全教育主题班会
2015/08/12 职场文书
MySQL中B树索引和B+树索引的区别详解
2022/03/03 MySQL