PHP preg_match只返回(。*?)值?

时间:2012-01-30 18:13:11

标签: php preg-match

努力获得preg匹配只返回图像URL而不是整个匹配的字符串。 我之后是否需要使用preg_replace,或者是否需要使用hagy?

可能一个不同的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]; 

3 个答案:

答案 0 :(得分:3)

如果您使用echo $match[0][0],您将拥有所有文本。

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

如果您改为编写$match[1][0],您将获得子模式匹配:

blabla bla

答案 1 :(得分: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
}

答案 2 :(得分:1)

默认情况下preg_match_all始终将完全匹配的字符串作为第一项返回(使用排序类型PREG_PATTERN_ORDER)。

来自PREG_PATTERN_ORDER的{​​{3}}:

  

对结果进行排序,以便$ matches [0]是一个完整模式的数组   匹配,$ matches docs是由第一个匹配的字符串数组   带括号的子模式,依此类推。

如果您正在寻找捕获组的值,请检查索引1处的值,然后使用捕获组引用作为子属性。

E.g。捕获组1将是:$matches[ 1 ][ 0 ]

要更改此行为,您可以将一个内容传递给第三个参数,例如PREG_SET_ORDER,其中“订购结果以便$ matches [0]是第一组匹配的数组,$ matches {{ 3}}是第二组匹配的数组,依此类推。“