Полностью игнорировать новые строки в регулярных выражениях - PullRequest
0 голосов
/ 28 октября 2018

Я знаю модификатор /s в регулярном выражении, но он не работает с моим конкретным случаем.

Например, я пытаюсь создать спам-фильтр, который сопоставляет URL-адреса с различными доменами, как этот

https://www.theonlineleaflets.com/u=/544hfb34s21jv335hs/u

Регулярное выражение: https:\/\/www\..+?\/u\/\w{18}\/u

Проблема заключается в том, что спаммеры вставляют символы новой строки и символы = случайным образом, как например:

<area  coords=3D"0,0,1000,1000" href=3D"https://www.theonlineleaflets.com/u=
/544hfb34s21jv335hs/u"/>

ИЛИ:

<area  coords=3D"0,0,1000,1000" href=3D"https://www.netprofessionalbitcoin.=
com/u/565i71cag5hd3kdh3mds/u"/>

ИЛИ:

<area  coords=3D"0,0,1000,1000" href=3D"https://www.theonlineleaflets.com/=
u/544hfb34s21jv335hs/u"/>

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

ПРИМЕЧАНИЕ : Это для cPanel, поэтому я предполагаю, что это стандартный формат PERL, и я недумаю, что он поддерживает такие модификаторы, как /s в любом случае.

ОБНОВЛЕНИЕ : похоже, что новая строка всегда следует за знаком =, однако этот знак может быть где угодно в URL.

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Я изменил ваше регулярное выражение для поддержки '=' и White Space (включая Newlines).

Это регулярное выражение:

https:\/\/www\..+?\/[u=\s]+\/[\w=\s]+\/[u=\s]+

Что я изменилиспользовать классы символов вместо литеральных соответствий.Таким образом, «=» и «Новые строки» эффективно игнорируются, и они будут соответствовать всем вашим примерам.

Единственная «проблема» состоит в том, что я удалил квантификатор «{18}» (так как эти плохие символы занимают место).

Редактировать согласно комментарию:

https:\/\/www\.[\s\S]+?\/[u=\s]+\/[\w=\s]+\/[u=\s]+

Я изменил точку '.' на класс символов '[\s\S]'.Теперь в URL также может быть Newlines.

О квантификаторе 18: во втором примере 20 символов, поэтому он не будет совпадать, если вы ограничите эту строку.

0 голосов
/ 28 октября 2018

Я придумал это регулярное выражение, которое учитывает потенциальные символы новой строки.

https:\/\/www\..+?\/=?(?:\s*?)?u(?:\s*?)?=?(?:\s*?)?\/.*?u

По сути, я использую (?:\s*?)?, что является необязательным, не захватывающим, ленивым совпадением любого количества символов пробела,в том числе и новые строки.Если вы хотите ограничить его только новыми строками, используйте \n. Вот демо.

...