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 相关文章推荐
如何给phpadmin一个保护
Oct 09 PHP
逐步提升php框架的性能
Jan 10 PHP
理解php Hash函数,增强密码安全
Feb 25 PHP
js和php邮箱地址验证的实现方法
Jan 09 PHP
php通过字符串调用函数示例
Mar 02 PHP
PHP输出缓存ob系列函数详解
Mar 11 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
Nov 05 PHP
php根据某字段对多维数组进行排序的方法
Mar 07 PHP
54个提高PHP程序运行效率的方法
Jul 19 PHP
深入php内核之php in array
Nov 10 PHP
CI框架集成Smarty的方法分析
May 17 PHP
Thinkphp框架开发移动端接口(2)
Aug 18 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 Undefined index和Undefined variable的解决方法
2008/03/27 PHP
PHP采集利器 Snoopy 试用心得
2011/07/03 PHP
php设计模式之单例模式使用示例
2014/01/20 PHP
PHP中使用BigMap实例
2015/03/30 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
javascript闭包传参和事件的循环绑定示例探讨
2014/04/17 Javascript
jquery实现的鼠标拖动排序Li或Table
2014/05/04 Javascript
JavaScript组合拼接字符串的效率对比测试
2014/11/06 Javascript
js实现简单鼠标跟随效果的方法
2015/04/10 Javascript
jquery心形点赞关注效果的简单实现
2016/11/14 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
2017/01/10 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
Grunt针对静态文件的压缩,版本控制打包的实例讲解
2017/09/29 Javascript
Webpack 4.x搭建react开发环境的方法步骤
2018/08/15 Javascript
小程序实现单选多选功能
2018/11/04 Javascript
angular中如何绑定iframe中src的方法
2019/02/01 Javascript
ES6箭头函数和扩展实例分析
2020/05/23 Javascript
在Python中封装GObject模块进行图形化程序编程的教程
2015/04/14 Python
pycharm远程调试openstack的图文教程
2017/11/21 Python
python使用threading.Condition交替打印两个字符
2019/05/07 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
python中JWT用户认证的实现
2020/05/18 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
详解css3 object-fit属性
2018/07/27 HTML / CSS
canvas绘图按照contain或者cover方式适配并居中显示
2019/02/18 HTML / CSS
商务会议邀请函
2014/01/09 职场文书
安全生产责任书
2014/03/12 职场文书
根叔历年演讲稿
2014/05/20 职场文书
工作作风承诺书
2014/08/30 职场文书
2015年度优秀员工推荐信
2015/03/23 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
Oracle中日期的使用方法实例
2022/07/07 Oracle