对正则表达式模式应用NOT限制

时间:2018-10-20 13:42:37

标签: regex preg-replace preg-replace-callback

我使用preg_replace_callback的模式

preg_replace_callback('/^(word1 .*),(.*)\./i',
function($m){
processing $m[1] and $m[2]
}, $str);

要匹配的句子以word1开头。如何修改模式以限制模式中的第二个单词?

只要word1不是第二个单词,上面的第一个匹配项应以word2,word3,etc开头。

我不想更改$m[1]$m[2],仅当word2,word2,etc是字符串中的第二个单词时匹配。

它应该匹配,

word1 something, and more.

但不是

word1 word2 something, and more.
word1 word3 something, and more.

2 个答案:

答案 0 :(得分:2)

如果要匹配以word1开头的行,但是word2word3不在行中的其他任何地方,那么您可以尝试使用否定的超前断言: / p>

^word1(?!.*\b(?:word2|word3)\b).*$

Demo

(?!.*\b(?:word2|word3)\b)一词断言,在行的其余部分,我们没有将word2word3视为独立的单词。

这是实际的PHP代码:

preg_replace_callback('/^(word1(?!.*\b(?:word2|word3)\b).*),(.*)\./i',
    function($m) {
        # processing $m[1] and $m[2]
    }, $str);

上面的代码中并没有太大变化,只是我插入了一个负向的前行以确保不会发生word2word3

答案 1 :(得分:1)

您可以使用:^(word1\s(?!word2|word3).+)\,\s?(.+)$

Demo