PHP cdata 處理(詳細介紹)
更新時間:2013年07月05日 12:54:05 作者:
之前為項目趕進度用php 的simplexml來解析 xml, 當時發(fā)現(xiàn) simplexml不支持<![CDATA標簽, 所有處于這個標簽內(nèi)的值都沒有辦法取到
當時在網(wǎng)上找了一個CDATA的轉(zhuǎn)換器, 修改之后, 將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;
最近發(fā)現(xiàn),總是有alert發(fā)出來, 說是simplexml解析出錯。
發(fā)現(xiàn)是原來有xml的數(shù)據(jù)是<![CDATA[domain[test]]] >. 出現(xiàn)了連續(xù)的3個], 造成上面的解析函數(shù)不能處理。
而且這個問題很難修正, 你不知道下次會不會有4, 5個]出現(xiàn)。
所以決定還是將這段解析 的代碼換成DOM XML,本身 DOM的處理還是比較簡單的,
包含DOMElement, DOMDocument, DOMNodeList, DOMNode幾個 component.
對于 DOMNode有nodeValue, nodeType, nodeName的成員函數(shù)。
首先先用loadXML將string轉(zhuǎn)化為DOMDocument對像, 再用getElementsByTagName轉(zhuǎn)化為DOMNodeList對像, 再使用->item(0)轉(zhuǎn)化為DOMNOde, 然后就可以使用上面的三種方法了。
對于 <aa color='red'>test</aa>這種xml標簽, 要使用 attribute函數(shù)。
復制代碼 代碼如下:
// 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;
最近發(fā)現(xiàn),總是有alert發(fā)出來, 說是simplexml解析出錯。
發(fā)現(xiàn)是原來有xml的數(shù)據(jù)是<![CDATA[domain[test]]] >. 出現(xiàn)了連續(xù)的3個], 造成上面的解析函數(shù)不能處理。
而且這個問題很難修正, 你不知道下次會不會有4, 5個]出現(xiàn)。
所以決定還是將這段解析 的代碼換成DOM XML,本身 DOM的處理還是比較簡單的,
包含DOMElement, DOMDocument, DOMNodeList, DOMNode幾個 component.
對于 DOMNode有nodeValue, nodeType, nodeName的成員函數(shù)。
首先先用loadXML將string轉(zhuǎn)化為DOMDocument對像, 再用getElementsByTagName轉(zhuǎn)化為DOMNodeList對像, 再使用->item(0)轉(zhuǎn)化為DOMNOde, 然后就可以使用上面的三種方法了。
對于 <aa color='red'>test</aa>這種xml標簽, 要使用 attribute函數(shù)。
相關(guān)文章
WordPress中用于檢索模版的相關(guān)PHP函數(shù)使用解析
這篇文章主要介紹了WordPress中用于檢索模版的相關(guān)PHP函數(shù)使用解析,包括索模板的函數(shù)的使用,要的朋友可以參考下2015-12-12
php實現(xiàn)將HTML頁面轉(zhuǎn)換成word并且保存的方法
這篇文章主要介紹了php實現(xiàn)將HTML頁面轉(zhuǎn)換成word并且保存的方法,結(jié)合實例形式分析了PHPWord工具的功能與使用方法,具有一定參考借鑒價值,需要的朋友可以參考下2016-10-10
php+mysqli實現(xiàn)將數(shù)據(jù)庫中一張表信息打印到表格里的方法
這篇文章主要介紹了php+mysqli實現(xiàn)將數(shù)據(jù)庫中一張表信息打印到表格里的方法,涉及mysqli查詢的相關(guān)技巧,需要的朋友可以參考下2015-01-01
PHP 抽象方法與抽象類abstract關(guān)鍵字介紹及應用
抽象方法指沒有方法體的方法,只要一個類里面有一個方法是抽象方法,那么這個類就要定義為抽象類,不了解的朋友可以看看2014-10-10

