PHP RegEx在模式内多次匹配XML模式

时间:2011-06-11 02:52:36

标签: php xml regex

我有一个XML文档,我想从中提取一些数据:

<tnt:results>
<tnt:result>
<Document id="id1">
<impact _blabla_ for="tree.def" name="Something has changed"
select="moreblabla">true</impact>
<impact _blabla_ for="plant.def" name="Something else has changed"
select="moreblabla">true</impact>
</Document>
</tnt:result>
</tnt:results>

实际上没有新的行 - 它是一个连续的字符串和,并且可以有多个&lt;文件&gt;元素。我想要一个提取的正则表达式:

  • ID1
  • tree.def / plant.def
  • 有些事情发生了变化/其他事情发生了变化

到目前为止我能够提出这个代码,但它只匹配第一个影响,而不是两个:

preg_match_all('/<Document id="(.*)">(<impact.*for="(.*)".*name="(.*)".*<\/impact>)*<\/Document>/U', $response, $matches);

另一种方法是匹配Document元素中的所有内容并再次通过RegEx传递它,但我认为只能使用一个RegEx来执行此操作。

提前多多感谢!

3 个答案:

答案 0 :(得分:1)

避免使用正则表达式来解析XML文档。

请参考here了解解析它们的最佳方法。

答案 1 :(得分:1)

只需使用DOM,就够了:

$dom = new DOMDocument;
$dom->loadXML($xml_string);

$documents = $dom->getElementsByTagName('Document');
foreach ($documents as $document) {
    echo $document->getAttribute('id');     // id1    

    $impacts = $document->getElementsByTagName('impact');
    foreach ($impacts as $impact) {
        echo $impact->getAttribute('for');  // tree.def
        echo $impact->getAttribute('name'); // Something has changed
    }
}

答案 2 :(得分:0)

不要使用RegEx。使用XML解析器。

实际上,如果您不得不担心多个Document元素并提取各种属性,那么使用XML解析器或XPath等查询语言会更好。