Регулярное выражение - Сопоставление ( только ) слов со смешанными символами

StackOverflow https://stackoverflow.com/questions/845890

Вопрос

я пишу свой фильтр защиты от спама / 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top