如何将词组排除在preg_match之外

时间:2016-06-21 11:12:22

标签: php preg-match

我有这个文字,我想搜索“工作”这个词,除了“在职培训”这个短语或短语列表。 如果我使用此preg_match http://regexr.com/3dlo7

我得到3个结果......但我只想要第1个和第3个

  

这是一份好工作,这是在职培训。干得好

有关preg_match的任何想法吗?

3 个答案:

答案 0 :(得分:3)

首先,当您要为PHP测试正则表达式时,不要使用专为Javascript设计的RegExr,而是可以使用regex101.comregex.larsolavtorvik.com

你可以像这样设计你的模式:

\bjob\b(?!(?<=\bon the job) training\b)

如果你想排除其他情况:

\bjob\b(?!(?<=\bon the job) training\b|(?<=\bthe job) I hate\b)

您还可以使用(*SKIP)(*F)模式(这会使子模式失败并强制跳过已匹配的字符),它可以更容易编写,但效率较低< em>(由于模式在开头有一个交替):

\b(?:on the job training\b(*SKIP)(*F)|the job I hate\b(*SKIP)(*F)|job\b)

您可以使用第一个字符识别技巧稍微改善它,以便在非感兴趣的位置快速失败:

\b(?=[otj])(?:on the job training\b(*SKIP)(*F)|the job I hate\b(*SKIP)(*F)|job\b)

答案 1 :(得分:1)

如何使用lookaround

$str = 'This is a good job and this is on the job training. Nice job';
preg_match_all('/(?<!on the )\bjob\b(?! training)/', $str, $m);
print_r($m);

<强>输出:

Array
(
    [0] => Array
        (
            [0] => job
            [1] => job
        )

)

答案 2 :(得分:0)

使用此正则表达式: -

\bjob(?!\straining)\b

http://regexr.com/3dloj

发表评论后,您还希望在单词之前排除单词,然后在正则表达式下使用: -

\b(?<!Nice\s)job(?!\straining)\b  // exclude Nice word

http://www.phpliveregex.com/p/g8h

(?<!Nice\s)job匹配Nice "job"之前没有"Nice "的{​​{1}},使用负面后瞻。