假设我正在尝试将/dog.*lab/
与此文本匹配:
“我有一只狗。我的狗是一个黑人实验室。他是在实验室里创造的。”
贪婪地,它会匹配“ dog。我的狗是一个黑色实验室。他是在实验室中创建的”。
我想找到两边最窄的比赛。如果我使用ungreedy修饰符,如
/dog.*?lab/
或/dog.*lab/U
它会匹配更少但仍然太多:
“狗。我的狗是黑人实验室”
有没有办法让我的搜索也从左边开始,因此只匹配“ dog is a black lab ”?
非常感谢。抱歉这个人为的例子。
答案 0 :(得分:10)
您可以使用look-ahead assertion排除dog
与dog
之间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"