2012-07-19 32 views
1

我想捕捉HTML中使用PHP的超鏈接的所有屬性,但我的正則表達式只返回最後一個屬性和值。PHP正則表達式只返回最後發生的重複模式?

HTML:

$string = ' 
<a href="http://www.example.com/" style="font-weight: bold;">Example</a> 
<a href="http://www.exampletwo.com/ style="font-weight: bold;">Example Two</a> 
'; 

正則表達式:

preg_match_all('/<a(?: (.*?)="(.*?)")*>(.*?)<\/a>/i', $string, $result); 

結果:

Array 
(
    [0] => Array 
     (
      [0] => <a href="http://www.example.com/" style="font-weight: bold;">Example</a> 
      [1] => <a href="http://www.exampletwo.com/" style="font-weight: bold;">Example Two</a> 
     ) 
    [1] => Array 
     (
      [0] => style 
      [1] => style 
     ) 
    [2] => Array 
     (
      [0] => font-weight: bold; 
      [1] => font-weight: bold; 
     ) 
    [3] => Array 
     (
      [0] => Example 
      [1] => Example Two 
     ) 
) 

我怎樣才能得到它返回所有結果從重複模式?

+0

()僅在您想要提取該值時才使用!使用類似:/.*? <\/>/ims – 2012-07-19 13:06:27

+1

重複捕獲組只捕獲最後一場比賽。 – nickb 2012-07-19 13:08:55

回答

3

如果我可以呈現給人們經常辱罵「正則表達式的HTML解析」替代:

<?php 
    $string = ' 
     <a href="http://www.example.com/" style="font-weight: bold;">Example</a> 
     <a href="http://www.exampletwo.com/" style="font-weight: bold;">Example Two</a> 
     '; 

    $dom = new DOMDocument; 
    $dom->loadHTML($string); 
    $as = $dom->getElementsByTagName('a'); 
    foreach ($as as $a) { 
     echo $a->nodeValue, '<br>'; 
     foreach ($a->attributes as $at) { 
      echo $at->nodeName, ' ', $at->nodeValue, '<br>'; 
     } 
     echo '<br><br>'; 
    } 
?> 

使用DOM文檔解析您的HTML,然後簡單地告訴它給你所有的錨標籤。但是,如果您懷疑自己會處理大量的HTML輸入,則始終存在XMLReader,但您在使用非正確或非XHTML輸入時會遇到問題。

+0

這將會訣竅!謝謝 – Matt 2012-07-19 17:16:45