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函数,php爱好者站推荐
Mar 19 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
May 07 PHP
Zend的MVC机制使用分析(二)
May 02 PHP
destoon出现验证码不显示时的紧急处理方法
Aug 22 PHP
PHP-Java-Bridge使用笔记
Sep 22 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
Jun 10 PHP
详解PHP的Yii框架中扩展的安装与使用
Apr 01 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
May 26 PHP
PHP云打印类完整示例
Oct 15 PHP
php生成二维码图片方法汇总
Dec 17 PHP
php输出含有“#”字符串的方法
Jan 18 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
Apr 06 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在特殊字符前加斜杠的实现代码
2011/07/17 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
简单了解WordPress开发中update_option()函数的用法
2016/01/11 PHP
Laravel 关联模型-关联新增和关联更新的方法
2019/10/10 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
jquery select(列表)的操作(取值/赋值)
2011/03/16 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
jQuery中end()方法用法实例
2015/01/08 Javascript
javacript使用break内层跳出外层循环分析
2015/01/12 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
vue axios数据请求及vue中使用axios的方法
2018/09/10 Javascript
搭建基于express框架运行环境的方法步骤
2018/11/15 Javascript
在Vue项目中使用jsencrypt.js对数据进行加密传输的方法
2019/04/17 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
Python线程之定位与销毁的实现
2019/02/17 Python
【python】matplotlib动态显示详解
2019/04/11 Python
将Pytorch模型从CPU转换成GPU的实现方法
2019/08/19 Python
python无序链表删除重复项的方法
2020/01/17 Python
Python之Django自动实现html代码(下拉框,数据选择)
2020/03/13 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
详解python内置模块urllib
2020/09/09 Python
python实现无边框进度条的实例代码
2020/12/30 Python
canvas如何实现多张图片编辑的图片编辑器
2020/03/10 HTML / CSS
阿玛瑞酒店中文官方网站:Amari.com
2018/02/13 全球购物
英国莱斯特松木橡木家具网上商店:Choice Furniture Superstore
2019/07/05 全球购物
工业学校毕业生自荐书
2014/01/03 职场文书
初二物理教学反思
2014/01/29 职场文书
2014年房产销售工作总结
2014/12/08 职场文书
单独二胎证明
2015/06/24 职场文书
总结Python连接CS2000的详细步骤
2021/06/23 Python
Redis实现订单过期删除的方法步骤
2022/06/05 Redis