2011-04-27 167 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