如何在字符串中的任何位置匹配精确的单词与PHP regexp

时间:2016-01-07 17:54:19

标签: php regex

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

因此,如果用户想要使用adminI am adminmy admin namemy username作为用户名,我希望我的正则表达式能够检测到它。如果他使用adminmember我可以忍受,那就不会发现它。我还希望检测不区分大小写。

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

/^[admin|username]+$/i

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

提前致谢。

4 个答案:

答案 0 :(得分:2)

正则表达式中的方括号不用于分组,它们用于指定字符类;分组是用括号完成的。您不希望使用private static int sumCuriousNumbers(int n) { int sum = 0; for (int i = 10; i <= n; i++) if (isCuriousNumber(i)) sum += i; return sum; } private static boolean isCuriousNumber(int number) { int sum = 0; for (int i = number; i > 0; i /= 10) sum += factorial(i % 10); return (sum % number == 0); } private static int factorial(int n) { int f = 1; for (int i = 1; i <= n; i++) f *= i; return f; } ^锚定正则表达式,因为它只会匹配字符串的开头和结尾;您想使用$来匹配字边界。

\b

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

请尝试使用以下代码段将您的单词列表保留在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";
}

工作小提琴网址:
http://sandbox.onlinephpfunctions.com/code/6f8e806683c45249338090b49ae9cd001851af49

答案 3 :(得分:0)

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

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

某些细节取决于您要应用的限制。