Регулярное выражение - Сопоставление ( только ) слов со смешанными символами
Вопрос
я пишу свой фильтр защиты от спама / badwors, и мне нужно, если это возможно,
сопоставлять (обнаруживать) только слова, образованные смешанными символами, такими как:fr1 & nd$ и не друзья
возможно ли это с помощью регулярного выражения!?
с наилучшими пожеланиями!
Решение
Конечно, это возможно с помощью регулярного выражения!Вы не просите сопоставлять вложенные круглые скобки!:P
Но да, именно для этого и были созданы регулярные выражения.Пример:
/\S*[^\w\s]+\S*/
Это будет соответствовать всем следующим:
@ss
as$
a$s
@$s
a$$
@s$
@$$
Это будет не сопоставьте это:
ass
Я верю, что это то, чего ты хочешь.Как это работает:
\S*
соответствует 0 или более символам, не содержащим пробелов. [^\w\s]+
соответствует только символам (он будет соответствовать всему, что не является словом или пробелом), и соответствует 1 или более из них (поэтому требуется символ symbol). Затем \S*
снова соответствует 0 или более символам без пробелов (символам и буквам).
Если мне будет позволено предложить лучшую стратегию, в Perl вы можете хранить регулярное выражение в переменной.Я не знаю, можете ли вы сделать это в PHP, но если можете, вы можете создать список переменных, подобных такому:
$a = /[aA@]/ # regex that matches all a-like symbols
$b = /[bB]/
$c = /[cC(]/
# etc...
Или:
$regex = array( 'a' => /[aA@]/, 'b' => /[bB]/, 'c' => /[cC(]/, ... );
Таким образом, вы можете сопоставить "friend" во всех его перестановках с:
/$f$r$i$e$n$d/
Или:
/$regex['f']$regex['r']$regex['i']$regex['e']$regex['n']$regex['d']/
Конечно, второй вариант выглядит излишне многословным, но это PHP для вас.Я думаю, что второй вариант, вероятно, является лучшим решением, поскольку он хранит их все в хэше, а не как отдельные переменные, но я признаю, что регулярное выражение, которое он выдает, немного уродливое.
Другие советы
Возможно, у вас будут не очень красивые правила регулярных выражений, но вы можете соответствовать практически любому шаблону, который вы можете описать с помощью регулярных выражений.Самое сложное - описать это.
Я бы предположил, что у вас будет куча правил регулярных выражений для обнаружения таких плохих слов, как so:
Чтобы обнаружить fr1&nd $, friends, fr **nd *, вы можете использовать регулярное выражение типа:
/fr[1iI*][&eE]nd[s$Sz]/
Сделав что-то подобное для каждого правила, вы найдете все варианты возможных символов в скобках.Возьмите руководство по регулярным выражениям для получения дополнительной информации.
(Я предполагаю, что для фильтра плохих слов вы хотели бы friend
а также , как frie**
, возможно, вы захотите замаскировать плохое слово, а также все возможные перестановки)
Не тестировал это тщательно, но это должно сработать:
(\w+)*(?<=[^A-Za-z ])
Вы могли бы создать несколько регулярных выражений, подобных следующему:
\p{L}+[\d\p{S}]+\S*
Это будет соответствовать любой последовательности из одной или нескольких букв (\p{L}+
, видеть Настройки символов Юникода), одна или несколько цифр или символов ([\d\p{S}]+
) и любые следующие символы, не содержащие пробелов \S*
.
$str = 'fr1&nd$ and not friends';
preg_match('/\p{L}+[\d\p{S}]+\S*/', $str, $match);
var_dump($match);