2016-06-08 85 views
0

我想了解preg_match_all()但我不太明白。這段代碼有什麼問題?我想用它來獲取URL:如何訪問preg_match_all()中的匹配項?

<?php 
$content = '<a href="http://www.google.com">Google</a> Lorem ipsum dolor sit amet, consectetur adipiscing elit <a href="http://stackoverflow.com">Stackoverflow</a>'; 
$search = preg_match_all("/<a\s[^>]*href=\"([^\"]*)\"[^>]*>(.*)<\/a>/siUU", $content, $matches); 

foreach ($matches as $match){ 
    echo $match; 
} 
?> 
+1

'print_r($ matches);' – AbraCadaver

+1

您有雙「U」修飾符。刪除一個。此外,您可以使用單引號來定義正則表達式而不是雙引號。順便說一句,你的代碼[似乎工作](http://ideone.com/Udwt0K)。 –

+0

@WiktorStribiżew - 你應該將你的評論和ideaone代碼發展成一個答案。如果你願意的話,我會加倍努力。 –

回答

2

作爲個人意見,我絕對喜歡旗PREG_SET_ORDER(默認爲PREG_PATTERN_ORDER)。

$search = preg_match_all("/<a\s[^>]*href=\"([^\"]*)\"[^>]*>(.*)<\/a>/siU", 
      $content, $matches, PREG_SET_ORDER); 

通過AbraCadaver概述的例子將被佈置成這樣的:

Array 
(
    [0] => Array 
     (
      [0] => <a href="http://www.google.com">Google</a> 
      [1] => http://www.google.com 
      [2] => Google 

     ) 

    [1] => Array 
     (
      [0] => <a href="http://stackoverflow.com">Stackoverflow</a> 
      [1] => http://stackoverflow.com 
      [2] => Stackoverflow 
     ) 

) 

2的結果,圖3(子)每個匹配 - 這是比較容易的工作。

喜歡的東西

foreach ($matches AS $match){ 
    echo $match[0]; // HTML 
    echo $match[1]; // URL 
    echo $match[2]; // PageName 
} 
+0

國際海事組織,那些不熟悉國旗的人不會被你的答覆幫助太大。考慮顯示帶有標誌的命令或鏈接到文檔。任何可以回答問題的東西:「好的,但是我怎樣才能使用'PREG_SET_ORDER'」 – BeetleJuice

+0

@Patrick Just就是要補充說:-) – dognose

1

你的模式運作,但正如指出的,你有雙重U修改,但是print_r($matches);產生這樣的:

Array 
(
    [0] => Array 
     (
      [0] => <a href="http://www.google.com">Google</a> 
      [1] => <a href="http://stackoverflow.com">Stackoverflow</a> 
     ) 

    [1] => Array 
     (
      [0] => http://www.google.com 
      [1] => http://stackoverflow.com 
     ) 

    [2] => Array 
     (
      [0] => Google 
      [1] => Stackoverflow 
     ) 
) 

所以要循環$matches[1]對應你的第一個捕獲組([^\"]*)應該得到的網址:

foreach ($matches[1] as $match){ 
    echo $match; 
} 

$matches[0]是完整的模式匹配,$matches[1]是第一個捕獲組()$matches[2]是第二捕獲組()等等

0

你只需要PREG_SET_ORDER。如果您使用命名捕獲,它會更清晰一些:

$mystring="abc"; 
preg_match_all('/(?<letter>[a-z])/', $mystring, $matches); 
print($matches["letter"][1]); // "b" 

$mystring="abc"; 
preg_match_all('/(?<letter>[a-z])/', $mystring, $matches, PREG_SET_ORDER); 
print($matches[1]["letter"]); // "b"