2012-01-30 103 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是第二组匹配的数组,等等。“