如何使用PHP正则表达式匹配字符串中任意位置的精确单词


How to match exact word anywhere in string with PHP regexp

我想知道用户是否在其可能的用户名字符串中的任何位置使用了单词adminusername

所以,如果用户想使用adminI am adminmy admin namemy username作为用户名,我希望我的regexp能检测到它。如果他使用adminmember,我可以接受,不要检测。我还希望检测不区分大小写。

到目前为止,我得到了这个,但它并没有像我想象的那样真正起作用,因为它会检测到不应该检测的单词:

/^[admin|username]+$/i

这甚至会匹配adm,而且不应该。我试过使用单词边界,但我也无法做到,也许我做错了什么。正如你在我的问题中看到的,我想在字符串中的任何地方检测单词admin,但如果它是某个单词的一部分,我可以跳过它。

提前谢谢。

正则表达式中的方括号不用于分组,而是用于指定字符类;分组是用括号完成的。您不希望使用^$来锚定regexp,因为这只会在字符串的开头和结尾匹配;您希望使用'b来匹配单词边界。
/'b(admin|username)'b/i

只需使用单词边界查找单词:

/'b(?:admin|username)'b/i

并且如果存在匹配返回错误,例如

if (preg_match('/'b(?:admin|username)'b/i', $input)) {
    die("Invalid Input");
}

尝试下面的片段,将单词列表保存在Array中。

$input = "im username ";
$spam_words = array("admin", "username");
$expression = '/'b(?:' . implode($spam_words, "|") . ')'b/i';
if (preg_match($expression, $input)) {
  die("Username contains invalid value");
}
else {
  echo "Congrats! is valid input";
}

工作Fiddle URL:
http://sandbox.onlinephpfunctions.com/code/6f8e806683c45249338090b49ae9cd001851af49

这可能是您正在寻找的模式:

'#(^|'s){1}('. $needle .')($|'s|,|'.){1}#i'

某些详细信息取决于您要应用的限制。