2012-01-30 100 views
0

努力獲得preg匹配,只返回圖片URL而不是整個匹配的字符串。 我是否需要在使用preg_replace之後或使用hacky?PHP preg_match僅返回(。*?)值?

可能是不同的syantax會得到我我需要什麼?

謝謝!

$source = file_get_contents('http://mysite.co.uk'); 
preg_match_all("'<div id=\"my-div\"><img src=\"(.*?)\" /></div>'", $source, $match); 
echo $match[0][0]; 
+1

[小馬他來...](http://stackoverflow.com/a/1732454/554546) – 2012-01-30 18:15:11

+1

[RegEx match open tags but XHTML self-contained tags](http:// stackoverflow .COM /問題/ 1732348 /正則表達式匹配開放標籤,除了-XHTML-自足標籤) – 2012-01-30 18:15:46

回答

3

如果使用回聲$match[0][0]你會擁有所有的文字。

<div id="my-div"><img src="blabla bla" /></div> 

如果你寫$match[1][0]相反,你會得到你修飾匹配:

blabla bla 
+1

我相信它應該是'$匹配[1] [0]' – Kartik 2012-01-30 18:21:08

+0

$匹配[1] [0] ;給了我我需要的東西。陣列問題!謝謝! – user1055774 2012-01-30 18:23:19

1

如果你正在尋找的第一個實例,你並不需要使用preg_match_all()

$source = file_get_contents('http://mysite.co.uk'); 
if (preg_match('#<div id="my-div"><img src="(.*?)" /></div>#', $source, $match)) { 
    echo $match[1]; 
} else { 
    // no match found 
} 

注意,這個表達式不會跨越多行匹配。

編輯:如果需要所有比賽,那麼你在正確的軌道上,但是您在使用索引0代替1,所以:

preg_match_all(..., $match); 
foreach ($match as $m) { 
    echo $m[1]; // Use 1 here instead of 0; 1 is the first capture group, where 0 is the entire matched string 
} 
1

默認情況下preg_match_all總是返回完全匹配的字符串作爲第一個項目(使用排序類型PREG_PATTERN_ORDER)。

docsPREG_PATTERN_ORDER

結果排序使得$ matches [0]爲整個模式的陣列 匹配,則$匹配1是由第一 括號內的子模式所匹配的字符串數組,等等。

如果您正在查找捕獲組的值,請檢查索引1處的值,然後使用捕獲組引用作爲子屬性。

E.g.捕獲組1將是:$matches[ 1 ][ 0 ]

要更改此行爲可以傳遞一個含量的不同,以作爲第三個參數,如PREG_SET_ORDER,其中「對結果排序使得$ matches [0]爲第一組匹配的陣列, $匹配1是第二組匹配的數組,等等。「