найти появление набора слов
-
22-07-2019 - |
Вопрос
У меня есть шаблон с небольшим списком слов, которые запрещено использовать в качестве псевдонимов, заданных в переменной шаблона следующим образом:
$pattern = webmaster|admin|webadmin|sysadmin
С использованием preg_match
, как можно добиться, чтобы ники с этими словами были запрещены, а регистрация типа "admin2
" или "thesysadmin
" позволено?
Это выражение, которое у меня есть до сих пор:
preg_match('/^['.$pattern.']/i','admin');
// Не должно быть разрешено
Примечание:Используя \b
не сильно помогло.
Решение
А как насчет того, чтобы вообще не использовать регулярное выражение?
И работая с explode
и in_array
?
Например, это будет делать:
$pattern = 'webmaster|admin|webadmin|sysadmin';
$forbidden_words = explode('|', $pattern);
Он превращает ваш паттерн в массив, используя | в качестве разделителя.
И это :
$word = 'admin';
if (in_array($word, $forbidden_words)) {
echo "<p>$word is not OK</p>";
} else {
echo "<p>$word is OK</p>";
}
достану тебя
admin is not OK
В то время как это (тот же код;меняется только слово) :
$word = 'admin2';
if (in_array($word, $forbidden_words)) {
echo "<p>$word is not OK</p>";
} else {
echo "<p>$word is OK</p>";
}
достану тебя
admin2 is OK
Таким образом, вам не нужно беспокоиться о поиске правильного регулярного выражения для соответствия полным словам:это просто будет соответствовать точным словам ;-)
Редактировать : одна проблема может заключаться в том, что сравнение будет чувствительным к регистру :-(
В этом поможет работа со всем, что написано в нижнем регистре:
$pattern = strtolower('webmaster|admin|webadmin|sysadmin'); // just to be sure ;-)
$forbidden_words = explode('|', $pattern);
$word = 'aDMin';
if (in_array(strtolower($word), $forbidden_words)) {
echo "<p>$word is not OK</p>";
} else {
echo "<p>$word is OK</p>";
}
Вы получите:
aDMin is not OK
(Я видел 'i
'отметьте в регулярном выражении только после публикации моего ответа;так что пришлось редактировать)
Редактировать 2: и, если вы действительно хотите сделать это с помощью регулярного выражения, вам нужно знать, что:
^
отмечает начало строки- и
$
отмечает конец строки
Итак, что-то вроде этого должно быть:
$pattern = 'webmaster|admin|webadmin|sysadmin';
$word = 'admin';
if (preg_match('#^(' . $pattern . ')$#i', $word)) {
echo "<p>$word is not OK</p>";
} else {
echo "<p>$word is OK</p>";
}
$word = 'admin2';
if (preg_match('#^(' . $pattern . ')$#i', $word)) {
echo "<p>$word is not OK</p>";
} else {
echo "<p>$word is OK</p>";
}
Круглые скобки, вероятно, не обязательны, но мне нравится их использовать, чтобы выделить то, что мне нужно.
И вы получите тот же результат:
admin is not OK
admin2 is OK
Вы, вероятно, не хотите использовать [
и ]
:они означают «любой символ, который находится между нами», а не «вся строка, которая находится между нами».
И, как ссылка:руководство прег-синтаксис ;-)
Другие советы
Итак, запрещенные слова могут быть частью их имени пользователя, но не полностью?
В .NET шаблон будет выглядеть так:
Allowed = Not RegEx.Match("admin", "^(webmaster|admin|webadmin|sysadmin)<*>quot;)
" ^ " соответствует началу строки, $ quot; соответствует концу, поэтому он ищет точное совпадение по одному из этих слов. Я немного неясен с соответствующим синтаксисом PHP.