我正在使用 preg_match_all 来执行字符串中的所有匹配
$match_this = '/cola/';
$sentence = 'cola this cola is a nice cola';
if(preg_match_all($match_this, $sentence, $matches)){
echo 'match found'.'<br>';
print_r($matches[0]);
}
但是当我遇到很好这个词时,我希望这个匹配执行操作停止, $ matches 数组不应该存储任何更多匹配的词。
如何为此修改代码?
'nice'之前可以有多次'cola'出现。这只是 一个例句。再次'cola'和'nice'只是示例单词。 从中随机挑选要匹配的单词和停止的位置 数据库。此代码适用于文字游戏。
答案 0 :(得分:2)
您可以使用正面lookahead:
$match_this = '\bcola\d\b';
$until = '\bnice\b';
$sentence = 'cola1 this cola2 is a nice cola3';
if(preg_match_all("/$match_this(?=.*$until)/", $sentence, $matches)){
print_r($matches[0]);
}
<强>输出:强>
Array
(
[0] => cola1
[1] => cola2
)
我在每个cola
的末尾添加了一个数字,以确保它只匹配单词nice
之前的数字。
我还在单词中添加了boudaries字样来匹配。
最后代码是:
$match_this = '\bcola\b';
$until = '\bnice\b';
$sentence = 'cola this cola is a nice cola';
if(preg_match_all("/$match_this(?=.*$until)/", $sentence, $matches)){
print_r($matches[0]);
}
答案 1 :(得分:1)
首先得到nice的偏移量,然后在它之前的子串上运行preg匹配。
$sentence = 'cola this cola is a nice cola';
$match_this = '/nice/';
if(preg_match($match_this, $sentence, $matches, PREG_OFFSET_CAPTURE)){
$niceOffset = $matches[0][1];
$match_this = '/cola/';
if(preg_match_all($match_this, substr($sentence, 0, $niceOffset), $matches2, PREG_OFFSET_CAPTURE)){
var_dump($matches2);
}
}