努力获得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];
答案 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}}是第二组匹配的数组,依此类推。“