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 相关文章推荐
探讨file_get_contents与curl效率及稳定性的分析
Jun 06 PHP
PHP 使用pcntl和libevent 实现Timer功能
Oct 27 PHP
PHP安全上传图片的方法
Mar 21 PHP
PHP中你应该知道的require()文件包含的正确用法
Jun 12 PHP
php检查页面是否被百度收录
Oct 28 PHP
PHP大神的十大优良习惯
Sep 14 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
Mar 09 PHP
php实现生成code128条形码的方法详解
Jul 19 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
Aug 05 PHP
php 函数中静态变量使用的问题实例分析
Mar 05 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
第七节--类的静态成员
2006/11/16 PHP
PHP静态调用非静态方法的应用分析
2013/05/02 PHP
Symfony2 session用法实例分析
2016/02/04 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
静态的动态续篇之来点XML
2006/12/23 Javascript
小议javascript 设计模式 推荐
2009/10/28 Javascript
让FireFox支持innerText的实现代码
2009/12/01 Javascript
JQuery UI DatePicker中z-index默认为1的解决办法
2010/09/28 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
JavaScript获取图片的原始尺寸以宽度为例
2014/05/04 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
php register_shutdown_function函数详解
2017/07/23 Javascript
vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动)
2017/10/16 Javascript
微信小程序显示下拉列表功能【附源码下载】
2017/12/12 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
2019/09/12 Javascript
layui对工具条进行选择性的显示方法
2019/09/19 Javascript
微信小程序canvas开发水果老虎机的思路详解
2020/02/07 Javascript
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
解决vue2中使用elementUi打包报错的问题
2020/09/22 Javascript
[57:59]EG vs Secret 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
在Python中实现shuffle给列表洗牌
2018/11/08 Python
python基础 range的用法解析
2019/08/23 Python
python实现机器人卡牌
2019/10/06 Python
python做接口测试的必要性
2019/11/20 Python
python 项目目录结构设置
2020/02/14 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
2020/02/25 Python
python3.7.3版本和django2.2.3版本是否可以兼容
2020/09/01 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
蹦床仓库:Trampoline Warehouse
2018/12/06 全球购物
护士节活动总结
2014/08/29 职场文书
2014年党员自我剖析材料
2014/10/07 职场文书
宪法宣传标语100条
2019/10/15 职场文书
阿里云服务器Ubuntu 20.04上安装Odoo 15
2022/05/20 Servers
vue实现在data里引入相对路径
2022/06/05 Vue.js