Php preg_match匹配单词列表,但不匹配某些单词

Php preg_match匹配单词列表,但不匹配某些单词,php,regex,preg-match,Php,Regex,Preg Match,我试图创建一个相当简单的正则表达式,与preg_match()一起使用,preg_match()用于检查用户代理字符串中可能存在的web爬虫/爬行器 例如,我现在使用的是类似的东西: preg|u match(/(bot | search | web | slurp | crawl)/i) 它似乎成功地匹配了包含“googlebot”或“webcrawler”之类内容的用户代理 然而,我遇到的问题是,当用户代理包含像“webkit”一样常见的东西时,这也会匹配 为了防止“webkit”等特定词语

我试图创建一个相当简单的正则表达式,与preg_match()一起使用,preg_match()用于检查用户代理字符串中可能存在的web爬虫/爬行器

例如,我现在使用的是类似的东西:

preg|u match(/(bot | search | web | slurp | crawl)/i)

它似乎成功地匹配了包含“googlebot”或“webcrawler”之类内容的用户代理

然而,我遇到的问题是,当用户代理包含像“webkit”一样常见的东西时,这也会匹配

为了防止“webkit”等特定词语被匹配,需要进行哪些修改?我对正则表达式知之甚少,花了数小时尝试了基于其他问题答案的各种组合,但迄今为止没有成功


非常感谢:)

为了排除特定的单词列表,您可以组合两个lookahead:

(?!webkit|robot)(?=bot|search|web|slurp|crawl)
显然第一部分是你的排除名单。这将匹配“web”但不匹配“webkit

关于语法的小说明。(?!regex)是负前瞻,而(?=regex)是正前瞻(非消费正则表达式)。你可以。
简而言之,前瞻意味着“匹配regex expr,但之后在原始匹配点继续匹配。”

是否有要排除的单词的完整列表?顺便说一句,我并不是要求查看列表:)
preg_match(/\b(bot(搜索)、web(搜索)、slurp(爬行)\b/ui)
如果我能排除一个理想的特定单词列表,因为我可能会遇到其他需要排除的单词。@l̕aͨEͩEͩEͩCͯ似乎解决了这个问题正在匹配,但现在它与我正在比较的其他用户代理(如“FastCrawler 3.0.X”)不匹配(crawler@1klik.dk)-“您必须提供要匹配的元素的完整列表,或要排除的元素的完整列表。。。同时,这个表达式应该有助于
(bot | search | web(?k)| slurp | crawl)
谢谢,这似乎工作得很好!我肯定我试过用?!但一定是用错了。@user2716559欢迎!我个人喜欢在在线正则表达式编辑器中快速测试我的表达式。我觉得很方便。