在字符串中执行单词匹配,直到在字符串中找到另一个单词

时间:2016-10-23 15:41:27

标签: php preg-match-all

我正在使用 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'只是示例单词。   从中随机挑选要匹配的单词和停止的位置   数据库。此代码适用于文字游戏。

2 个答案:

答案 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);
    }
}