найти вхождение набора слов - PullRequest
1 голос
/ 05 августа 2009

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

$pattern = webmaster|admin|webadmin|sysadmin

Используя preg_match, как можно добиться того, чтобы псевдонимы с этими словами были запрещены, но разрешено регистрировать что-то вроде "admin2" или "thesysadmin"?

У меня есть такое выражение:

preg_match('/^['.$pattern.']/i','admin');

// Не допускается

Примечание: использование \b мало помогло.

Ответы [ 2 ]

3 голосов
/ 05 августа 2009

А как насчет того, чтобы вообще не использовать регулярные выражения?
И работает с 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 ; -)

0 голосов
/ 05 августа 2009

Итак, запрещенные слова могут быть частью их имени пользователя, но не полностью?

В .NET шаблон будет:

 Allowed = Not RegEx.Match("admin", "^(webmaster|admin|webadmin|sysadmin)$")

«^» соответствует началу строки, «$» соответствует концу, поэтому он ищет точное совпадение для одного из этих слов. Я немного неясен с соответствующим синтаксисом PHP.

...