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 相关文章推荐
一个ftp类(ini.php)
Oct 09 PHP
自动生成文章摘要的代码[PHP 版本]
Mar 20 PHP
一步一步学习PHP(6) 面向对象
Feb 16 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
Dec 30 PHP
php中判断数组是一维,二维,还是多维的解决方法
May 04 PHP
php实现12306余票查询、价格查询示例
Apr 17 PHP
php实现QQ空间获取当前用户的用户名并生成图片
Jul 25 PHP
Laravel日志用法详解
Oct 09 PHP
php封装的page分页类完整实例
Oct 18 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
PHP递归统计系统中代码行数
Sep 19 PHP
PHP 出现 http500 错误的解决方法
Mar 09 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程序--记数器
2006/10/09 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
非常不错的功能强大代码简单的管理菜单美化版
2008/07/09 Javascript
JavaScript中的闭包原理分析
2010/03/08 Javascript
JavaScript 比较时间大小的代码
2010/04/24 Javascript
Jquery实现图片预加载与延时加载的方法
2014/12/22 Javascript
jQuery实现非常实用漂亮的select下拉菜单选择效果
2015/11/06 Javascript
js如何判断输入字符串长度
2015/12/16 Javascript
Bootstrap网格系统详解
2016/04/26 Javascript
JQuery点击行tr实现checkBox选中的简单实例
2016/05/26 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
2016/12/30 Javascript
VUE JS 使用组件实现双向绑定的示例代码
2017/01/10 Javascript
js实现城市级联菜单的2种方法
2017/06/23 Javascript
NodeJS实现视频转码的示例代码
2017/11/18 NodeJs
vue调试工具vue-devtools安装及使用方法
2018/11/07 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
vue路由传参三种基本方式详解
2019/12/09 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
2020/11/19 Vue.js
win7安装python生成随机数代码分享
2013/12/27 Python
使用Python对Excel进行读写操作
2017/03/30 Python
numpy数组拼接简单示例
2017/12/15 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
python使用列表的最佳方案
2020/08/12 Python
python爬取音频下载的示例代码
2020/10/19 Python
Pytorch之扩充tensor的操作
2021/03/04 Python
优秀护士演讲稿
2014/04/30 职场文书
学校三节实施方案
2014/06/09 职场文书
节约粮食标语
2014/06/18 职场文书
标准毕业生自荐信
2014/06/24 职场文书
三严三实对照检查材料
2014/08/25 职场文书
技术负责人岗位职责
2015/02/10 职场文书
2015安全保卫工作总结
2015/04/25 职场文书
Django Paginator分页器的使用示例
2021/06/23 Python
从零开始在Centos7上部署SpringBoot项目
2022/04/07 Servers