我有这个文字,我想搜索“工作”这个词,除了“在职培训”这个短语或短语列表。 如果我使用此preg_match http://regexr.com/3dlo7
我得到3个结果......但我只想要第1个和第3个
这是一份好工作,这是在职培训。干得好
有关preg_match的任何想法吗?
答案 0 :(得分:3)
首先,当您要为PHP测试正则表达式时,不要使用专为Javascript设计的RegExr,而是可以使用regex101.com或regex.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
发表评论后,您还希望在单词之前排除单词,然后在正则表达式下使用: -
\b(?<!Nice\s)job(?!\straining)\b // exclude Nice word
http://www.phpliveregex.com/p/g8h
(?<!Nice\s)job
匹配Nice
"job"
之前没有"Nice "
的{{1}},使用负面后瞻。