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 相关文章推荐
Joomla下利用configuration.php存储简单数据
May 19 PHP
zend framework多模块多布局配置
Feb 26 PHP
PHP框架Swoole定时器Timer特性分析
Aug 19 PHP
WordPress中制作导航菜单的PHP核心方法讲解
Dec 11 PHP
PHP统计目录中文件以及目录中目录大小的方法
Jan 09 PHP
PHP反射API示例分享
Oct 08 PHP
PHP中多线程的两个实现方法
Oct 14 PHP
PHP+iframe图片上传实现即时刷新效果
Nov 18 PHP
php readfile下载大文件失败的解决方法
May 22 PHP
PHP实现腾讯与百度坐标转换
Aug 05 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 PHP
php7 参数、整形及字符串处理机制修改实例分析
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获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
PHP教程 变量定义
2009/10/23 PHP
PHP随机字符串生成代码(包括大小写字母)
2013/06/24 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
2014/04/01 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
JavaScript CSS 修改学习第四章 透明度设置
2010/02/19 Javascript
jQuery 顺便学习下CSS选择器 奇偶匹配nth-child(even)
2010/05/24 Javascript
JS调用CS里的带参方法实例
2013/08/01 Javascript
Javascript中call的两种用法实例
2013/12/13 Javascript
jquery实现tr元素的上下移动示例代码
2013/12/20 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
javascipt:filter过滤介绍及使用
2014/09/10 Javascript
原生js和jquery分别实现横向导航菜单效果
2016/05/13 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
javascript 判断一个对象为数组的方法
2017/05/03 Javascript
jquery对table做排序操作的实例演示
2017/08/10 jQuery
JQuery模拟实现网页中自定义鼠标右键菜单功能
2018/11/14 jQuery
使用layer.msg 时间设置不起作用的解决方法
2019/09/12 Javascript
JS实现放烟花效果
2020/03/10 Javascript
非常漂亮的js烟花效果
2020/03/10 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
JavaScript实现鼠标经过表格某行时此行变色
2020/11/20 Javascript
[59:00]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第一场 3月7日
2021/03/11 DOTA
python通过get,post方式发送http请求和接收http响应的方法
2015/05/26 Python
python定时器(Timer)用法简单实例
2015/06/04 Python
python去除文件中重复的行实例
2018/06/29 Python
Python3.8中使用f-strings调试
2019/05/22 Python
选择Python写网络爬虫的优势和理由
2019/07/07 Python
Django实现列表页商品数据返回教程
2020/04/03 Python
Lombok插件安装(IDEA)及配置jar包使用详解
2020/11/04 Python
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
校园文明标语
2014/06/13 职场文书
少年犯观后感
2015/06/11 职场文书
欢送会主持词
2015/07/01 职场文书
2015少先队大队辅导员工作总结
2015/07/24 职场文书
python+pytest接口自动化之token关联登录的实现
2022/04/06 Python