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-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
Aug 15 PHP
PHP编码转换
Nov 05 PHP
ThinkPHP中的关联模型注意点
Jun 16 PHP
浅析php单例模式
Nov 25 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
Apr 03 PHP
PHP实现删除字符串中任何字符的函数
Aug 11 PHP
PHP带节点操作的无限分类实现方法详解
Nov 09 PHP
php 变量引用与变量销毁机制详细介绍
Dec 05 PHP
Windows下php+mysql5.7配置教程
May 16 PHP
YII框架常用技巧总结
Apr 27 PHP
PHP goto语句用法实例
Aug 06 PHP
discuz论坛更换域名,详细文件修改步骤
Dec 09 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 COOKIE立即生效,不用刷新就可以使用
2011/03/09 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
php+mysql开发中的经验与常识小结
2019/03/25 PHP
jQuery 借助插件Lavalamp实现导航条动态美化效果
2013/09/27 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
2016/11/25 Javascript
原生JS实现圣旨卷轴展开效果
2017/03/06 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
react-intl实现React国际化多语言的方法
2020/09/27 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
python批量提交沙箱问题实例
2014/10/08 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
Django框架 querySet功能解析
2019/09/04 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
在Python 的线程中运行协程的方法
2020/02/24 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
Python如何实现后端自定义认证并实现多条件登陆
2020/06/22 Python
Scrapy实现模拟登录的示例代码
2021/02/21 Python
美国存储和组织商店:The Container Store
2017/08/16 全球购物
美国快时尚彩妆品牌:Winky Lux(透明花瓣润唇膏)
2018/11/06 全球购物
机械绘图员岗位职责
2013/11/19 职场文书
县优秀教师事迹材料
2014/01/31 职场文书
会计助理岗位职责
2014/02/17 职场文书
2014年工会工作总结
2014/11/12 职场文书
2014年度培训工作总结
2014/11/27 职场文书
销售助理岗位职责
2015/02/11 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
学校证明范文
2015/06/24 职场文书
签字仪式主持词
2015/07/03 职场文书
记者节感言
2015/08/03 职场文书