从左侧开始使用正则表达式(即两侧可能最窄的匹配)

时间:2010-08-23 16:11:35

标签: php regex lookahead

假设我正在尝试将/dog.*lab/与此文本匹配:

“我有一只狗。我的狗是一个黑人实验室。他是在实验室里创造的。”

贪婪地,它会匹配“ dog。我的狗是一个黑色实验室。他是在实验室中创建的”。

我想找到两边最窄的比赛。如果我使用ungreedy修饰符,如
/dog.*?lab//dog.*lab/U它会匹配更少但仍然太多:
“狗。我的狗是黑人实验室”

有没有办法让我的搜索也从左边开始,因此只匹配“ dog is a black lab ”?

非常感谢。抱歉这个人为的例子。

3 个答案:

答案 0 :(得分:10)

您可以使用look-ahead assertion排除dogdog之间lab的出现次数:

/dog(?:(?!dog).)*?lab/

答案 1 :(得分:2)

这对我有用:

$str = "I have a dog. My dog is a black lab. He was created in a laboratory.";
if(preg_match('/.*(dog.*?lab)/',$str,$m)) {
    var_dump($m);
}

答案 2 :(得分:1)

一个想法可能是尝试使用否定字符集,例如[^.!?],它将匹配除.?!之外的所有字符,因此您可以肯定它在同一个句子中:

$string = "I have a dog. My dog is a black lab. He was created in a laboratory.";
preg_match('/dog[^.!?]*?lab/', $string, $match);
echo $match[0]; // Echoes "dog is a black lab"