PHP cdata 处理(详细介绍)
PHP cdata 处理(详细介绍)
发布时间:2016-12-29 来源:查字典编辑
摘要:当时在网上找了一个CDATA的转换器,修改之后,将CDATA标签给过滤掉。如下复制代码代码如下://States:////'out'//''...

当时在网上找了一个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教程学习
编程开发子分类