Вопрос

У меня есть шаблон с небольшим списком слов, которые запрещено использовать в качестве псевдонимов, заданных в переменной шаблона следующим образом:

$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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top