PHP preg_match $ offset选项混乱

时间:2017-02-13 06:20:03

标签: php preg-match

在php.net preg_match页面中,它说

  

注意:   使用offset不等于将substr($ subject,$ offset)传递给> preg_match()来代替主题字符串,因为pattern可以包含>断言,例如^,$或(?< = x)。

php.net

这是否意味着如果模式中存在断言,偏移选项将被忽略。 断言如何影响主题字符串

1 个答案:

答案 0 :(得分:2)

不,不忽略偏移量,但这些断言适用于整个字符串,而不是从偏移量开始的字符串。因此,根据您是否传递子字符串或使用offset参数,您可以获得不同的结果。特别是,^匹配字符串的开头,而不是偏移位置。

引用行下方的示例清楚地表明了这一点:

$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);

这没有匹配,因为即使def在字符串中的偏移量为3,它也不在字符串的开头。

如果忽略了偏移量,您可以使用类似/^abc/的模式,它会匹配。但这也不会匹配,因为abc在偏移之前。