Regex - сопоставлять (только) слова со смешанными символами - PullRequest
2 голосов
/ 10 мая 2009

Я пишу свой антиспамовый фильтр, и мне нужно, если возможно,

для сопоставления (обнаружения) только слов, образованных смешанными символами, такими как: fr1 & nd $, а не друзей

возможно ли это с помощью регулярных выражений!?

С наилучшими пожеланиями!

Ответы [ 4 ]

6 голосов
/ 10 мая 2009

Конечно, это возможно с регулярным выражением! Вы не просите соответствовать вложенным скобкам! : P

Но да, именно для этого были созданы регулярные выражения. Пример:

/\S*[^\w\s]+\S*/

Это будет соответствовать всем следующим:

@ss
as$
a$s
@$s
a$$
@s$
@$$

Будет не соответствовать этому:

ass

То, что я верю, то, что вы хотите. Как это работает:

\S* соответствует 0 или более непробельным символам. [^\w\s]+ соответствует только символам (оно будет соответствовать всему, что не является ни словом, ни пробелом), и соответствует 1 или более из них (поэтому требуется символьный символ). Затем \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(]/, ... );

Таким образом, вы можете сопоставить «друга» во всех его перестановках с:

/$f$r$i$e$n$d/

Или:

/$regex['f']$regex['r']$regex['i']$regex['e']$regex['n']$regex['d']/

Конечно, второй выглядит излишне многословным, но это PHP для вас. Я думаю, что второе, вероятно, является лучшим решением, так как оно хранит их все в хэше, а не как отдельные переменные, но я признаю, что это регулярное выражение немного уродливо.

0 голосов
/ 10 мая 2009

Не проверял это полностью, но это должно сделать это:

(\w+)*(?<=[^A-Za-z ])
0 голосов
/ 10 мая 2009

Возможно, у вас не будет очень красивых правил регулярных выражений, но вы можете сопоставить практически любой шаблон, который вы можете описать с помощью регулярных выражений. Сложная часть описывает это.

Я бы предположил, что у вас будет куча правил регулярных выражений для обнаружения плохих слов, например:

Чтобы обнаружить fr1 и nd $, друзья, fr ** nd *, вы можете использовать регулярное выражение, например:

/fr[1iI*][&eE]nd[s$Sz]/

Делая что-то подобное для каждого правила, вы найдете все варианты возможных символов в скобках. Подберите справочник регулярных выражений для получения дополнительной информации.

(я предполагаю, что для фильтра плохих слов вы бы хотели friend, а также frie**, вы можете захотеть замаскировать плохое слово, а также все возможные перестановки)

0 голосов
/ 10 мая 2009

Вы можете создать несколько регулярных выражений, таких как:

\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);
...