2011-04-27 271 views
1

我試圖使用正則表達式從以下XML提要提取CDATA:http://www.patrickarundell.net/THREE-IE-FEED.asp正則表達式

我的代碼如下:

$xml = file_get_contents('http://www.patrickarundell.net/THREE-IE-FEED.asp'); 

$arr = array(); 
preg_match('/(CDATA)(.*)/', $xml, $arr); 
echo '<pre>'; 
    print_r($arr); 
echo '</pre>'; 

輸出是:

Array 
(
    [0] => CDATA[ 
    [1] => CDATA 
    [2] => [ 
) 

我知道我沒有正確的表達方式,但是當我嘗試以下語句時:

preg_match('/(<![CDATA[)(.*)/', $xml, $arr); 

我得到一個錯誤:

Warning: preg_match() [function.preg-match]: Compilation failed: missing terminating ] for character class at offset 15

我認爲方括號「[」,這就是我正在尋找後,這可能給我的細節。

任何幫助表示讚賞,我一直試圖這幾個小時,沒有運氣。

+0

您是否考慮過XML解析器? – BalusC 2011-04-27 20:47:52

+0

是的,我使用SimpleXMLElement解析文件的其餘部分,並且工作正常。它不會給我任何問題。但是我無法使用SimpleXMLElement獲取CDATA部分的細節。如果您看到XML文件,則實際星座詳細信息位於節點下。當我參考這個節點時,它會將所有數據放在一起。 – Stephen 2011-04-27 23:01:08

回答

3

錯誤消息的原因是它缺少字符類的關閉]。但是你不想用你想要匹配的[來定義一個字符類,所以你需要將它轉義出來\[

<!\[(CDATA)\[\s*(.*?)\s*\]\]> 

我在這裏測試了regexr

.*?是一個非貪婪匹配,它儘可能少的相匹配,直到它找到閉合]]>

+0

stema,謝謝你。只有一個問題,我設法將第一個CDATA值放入數組中。但正如您從XML中看到的那樣,還有一些其他CDATA段。我如何管理這些? – Stephen 2011-04-28 08:56:10

+0

@Stephen,我不太瞭解php,但有一個'preg_match_all'函數,試着用這個代替'preg_match'。根據[本文檔](http://de.php.net/manual/en/function.preg-match-all.php)它應該做你想做的。 – stema 2011-04-28 09:09:11

+0

非常感謝。這很有用。 – Stephen 2011-04-28 09:19:52