【问题标题】:Using regex with XML将正则表达式与 XML 结合使用
【发布时间】:2011-08-14 04:48:40
【问题描述】:

我正在尝试使用正则表达式从以下 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);

我收到一个错误:

警告:preg_match() [function.preg-match]:编译失败:偏移 15 处的字符类缺少终止]

我认为这可能会在方括号“[”之后为我提供详细信息,这就是我正在寻找的内容。

感谢您的帮助,我已经尝试了几个小时但没有运气。

【问题讨论】:

  • 你考虑过 XML 解析器吗?
  • 是的,我正在使用 SimpleXMLElement 来解析文件的其余部分,并且效果很好。它没有给我任何问题。但我无法使用 SimpleXMLElement 获取 CDATA 部分的详细信息。如果您看到 XML 文件,则实际星座详细信息位于 节点下。当我引用这个节点时,它会将所有数据集中在一起。

标签: php regex cdata


【解决方案1】:

错误消息的原因是它缺少字符类的结束]。但是你不想用你想要匹配的[ 定义一个字符类,所以你需要将它转义\[

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

我在regexr这里测试过

.*? 是一个非贪心匹配,它匹配的越少越好,直到找到关闭的]]&gt;

【讨论】:

  • stema,谢谢。只是一个问题,我设法将第一个 CDATA 值放入数组中。但正如您从 XML 中看到的,还有许多其他 CDATA 段。我该如何管理这些?
  • @Stephen,我不是很懂php,但是有个函数preg_match_all,试试用这个代替preg_match。根据this documentation,它应该做你想做的事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多