А как насчет того, чтобы вообще не использовать регулярные выражения?
И работает с 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
Вы, вероятно, не хотите использовать [
и ]
: они означают «любой символ, который находится между нами», а не «всю строку, которая находится между нами».
И, для справки: руководство по синтаксису preg ; -)