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中HTTP方式下的Gzip压缩传输方法举偶
Feb 15 PHP
PHP生成带有雪花背景的验证码
Sep 28 PHP
PHP Pear 安装及使用
Mar 19 PHP
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
Oct 31 PHP
PHP 一个随机字符串生成代码
May 26 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
May 15 PHP
php防止sql注入代码实例
Dec 18 PHP
ThinkPHP中的三大自动简介
Aug 22 PHP
Eclipse PHPEclipse 配置的具体步骤
Aug 08 PHP
php strftime函数获取日期时间(switch用法)
May 16 PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 PHP
php经典趣味算法实例代码
Jan 21 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 SPL标准库之数据结构栈(SplStack)介绍
2015/05/12 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
PHP实现字符串的全排列详解
2019/04/24 PHP
JQuery与iframe交互实现代码
2009/12/24 Javascript
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
2010/03/23 Javascript
kmock javascript 单元测试代码
2011/02/06 Javascript
Javascript 面向对象编程(coolshell)
2012/03/18 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
解析ajaxFileUpload 异步上传文件简单使用
2016/12/30 Javascript
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
jquery自定义显示消息数量
2017/12/19 jQuery
JS实现移动端触屏拖拽功能
2018/07/31 Javascript
学习使用ExpressJS 4.0中的新Router的用法
2018/11/06 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
微信小程序实现滚动Tab选项卡
2020/11/16 Javascript
python结合API实现即时天气信息
2016/01/19 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
一百行python代码将图片转成字符画
2021/02/19 Python
Python实现查找最小的k个数示例【两种解法】
2019/01/08 Python
python自动化UI工具发送QQ消息的实例
2019/08/27 Python
numpy.linalg.eig() 计算矩阵特征向量方式
2019/11/29 Python
基于SpringBoot构造器注入循环依赖及解决方式
2020/04/26 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
2020/09/28 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
新加坡领先的时尚生活方式零售品牌:CHARLES & KEITH
2018/01/16 全球购物
英国玛莎百货美国官网:Marks & Spencer美国
2018/11/06 全球购物
可持续未来的时尚基础:Alternative Apparel
2019/05/06 全球购物
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
以太网Ethernet IEEE802.3
2013/08/05 面试题
2014年党建工作总结
2014/11/11 职场文书
2016自主招生校长推荐信范文
2015/03/23 职场文书
紧急迫降观后感
2015/06/15 职场文书
初中政治教学工作总结
2015/08/13 职场文书
导游词之云南-元阳梯田
2019/10/08 职场文书
浅析Python中的随机采样和概率分布
2021/12/06 Python