2011-06-11 24 views
2

我有一個XML文檔,從中我想提取一些數據:PHP正則表達式匹配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
  • tree.def中/ plant.def
  • 東西已經改變/別的東西已經改變

我上不來與此代碼,到目前爲止,但它只匹配的第一個影響,而不是他們兩個:

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

的另一種方式做它將匹配Document元素中的所有內容並再次通過RegEx傳遞它,但我認爲我只能通過一個RegEx來完成此操作。

非常感謝!

+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags每個人都得到它一旦;我當然有。 – Dan 2011-06-11 02:56:06

+0

謝謝,有一個很好的笑:) – cdavid 2011-06-11 03:00:04

回答

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 
    } 
} 
+0

是的,我已經寫了代碼,看起來非常類似於你...謝謝:) – cdavid 2011-06-11 03:25:45

0

請勿使用RegEx。使用XML解析器。

真的,如果您不得不擔心多個Document元素並提取各種屬性,那麼最好使用XML解析器或查詢語言(如XPath)。

1

避免使用正則表達式來解析XML文檔。

請參考here解析它們的最佳方式。