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


PHP RegEx match XML pattern multiple times inside pattern

我有一个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>

实际上没有新的行——它是一个连续的字符串和,并且可以有多个<文档>元素。我想要一个正则表达式,它提取:

  • id1
  • 树.def/plant.def
  • 有些东西变了

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

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

另一种方法是匹配Document元素中的所有内容,并再次通过RegEx传递它,但我认为我只需要一个RegEx就可以做到这一点。

提前感谢!

只需使用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
    }
}

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

实际上,如果您必须担心多个Document元素和提取各种属性,那么最好使用XML解析器或XPath之类的查询语言。