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中str_replace函数使用小结
Oct 11 PHP
浅谈PHP 闭包特性在实际应用中的问题
Oct 30 PHP
thinkphp的URL路由规则与配置实例
Nov 26 PHP
php获取CSS文件中图片地址并下载到本地的方法
Dec 02 PHP
PHP中基本HTTP认证技巧分析
Mar 16 PHP
从刷票了解获得客户端IP的方法
Sep 21 PHP
php中注册器模式类用法实例分析
Nov 03 PHP
CodeIgniter配置之SESSION用法实例分析
Jan 19 PHP
PHP实现原生态图片上传封装类方法
Nov 08 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
Jun 13 PHP
tp5.1 框架数据库高级查询技巧实例总结
May 25 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实现把数字ID转字母ID
2013/08/12 PHP
YII模块实现绑定二级域名的方法
2014/07/09 PHP
PHP封装CURL扩展类实例
2015/07/28 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
JavaScript arguments 多参传值函数
2010/10/24 Javascript
关于JS数组追加数组采用push.apply的问题
2014/06/09 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
2017/10/08 Javascript
Vue Promise的axios请求封装详解
2018/08/13 Javascript
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
[55:56]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
python爬虫入门教程--优雅的HTTP库requests(二)
2017/05/25 Python
python smtplib发送带附件邮件小程序
2018/05/22 Python
详解Python3.6安装psutil模块和功能简介
2018/05/30 Python
python实现维吉尼亚加密法
2019/03/20 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
2020/12/04 Python
Python 可视化神器Plotly详解
2020/12/26 Python
CSS3为背景图设置遮罩并解决遮罩样式继承问题
2020/06/22 HTML / CSS
大学生职业生涯规划书前言
2014/01/09 职场文书
小学生家长寄语
2014/04/02 职场文书
募捐倡议书
2014/04/14 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
关于学习的决心书
2015/02/05 职场文书
自我工作评价范文
2015/03/06 职场文书
2015年民兵整组工作总结
2015/07/24 职场文书
使用nginx动态转换图片大小生成缩略图
2021/03/31 Servers
Sql Server之数据类型详解
2022/02/28 SQL Server
Python数据结构之队列详解
2022/03/21 Python