Регулярное выражение PHP для фильтрации URL-адресов из определенных доменов для использования в плагине vBulletin

Я пытаюсь собрать подключаемый модуль для vBulletin, чтобы отфильтровать ссылки на сайты обмена файлами. Но, как я уверен, вы часто слышите, я новичок в php, не говоря уже о регулярных выражениях.

В основном, я пытаюсь собрать регулярное выражение и использовать preg_replace, чтобы найти любые URL-адреса из этих доменов и заменить всю ссылку сообщением о том, что они не разрешены. Я бы хотел, чтобы он нашел ссылку, связан ли она с гиперссылкой, размещен как обычный текст или заключен в теги [CODE] bb.

Что касается регулярного выражения, мне нужно будет найти URLS со следующим, я думаю:

  1. Начинается с http или тега привязки. Я считаю, что URLS в тегах [CODE] можно обрабатывать так же, как и URL-адреса простого текста, и это нормально, если замена заканчивается внутри тега [CODE].
  2. Может содержать любое количество символов до домена / слова
  3. Имеет ли домен где-то посередине
  4. Может содержать любое количество символов после домена
  5. Заканчивается несколькими расширениями, такими как (html | htm | rar | zip | 001) или в закрывающей привязке.

У меня такое чувство, что цифры 2 и 4 меня подталкивают (если не намного больше). Я нашел аналогичный вопрос здесь и попытался немного разобрать код (хотя я этого и не понял). У меня теперь есть то, что, как я думал, может работать, но это не так:

<?php $filterthese = array('domain1', 'domain2', 'domain3'); $replacement = 'LINKS HAVE BEEN FILTERED MESSAGE'; $regex = array('!^http+([a-z0-9-]+\.)*$filterthese+([a-z0-9-]+\.)*(html|htm|rar|zip|001)$!', '!^<a+([a-z0-9-]+\.)*$filterthese+([a-z0-9-]+\.)*</a>$!'); $this->post['message'] = preg_replace($regex, $replacement, $this->post['message']); ?> 

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

Благодарю.

Вы можете использовать parse_url в URL-адресах и посмотреть на возвращаемый хэш-файл. Это позволяет фильтровать для доменов или даже более мелкозернистый контроль.

Я думаю, вы можете избежать накладных расходов при использовании встроенной функции filter_var .

Вы можете использовать эту функцию с PHP 5.2.0.

 $good_url = filter_var( filter_var( $raw_url, FILTER_SANITIZE_URL), FILTER_VALIDATE_URL); 

Хм, мое первое предположение: вы помещаете $filterthese прямо внутри строки с одним $filterthese . Эти одинарные кавычки не позволяют заменять переменные. Кроме того, $filterthese – это массив, который должен быть сначала соединен:

 var $filterthese = implode("|", $filterthese); 

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

Изменить: ОК, при повторной проверке вашего предоставленного источника я думаю, что строка регулярного выражения должна выглядеть следующим образом:

 $regex = '!(?# possible "a" tag [start]: )(<a[^>]+href=["\']?)?(?# offending link: )https?://(?# possible subdomains: )(([a-z0-9-]+\.)*\.)?(?# domains to block: )('.implode("|", $filterthese).')(?# possible path: )(/[^ "\'>]*)?(?# possible "a" tag [end]: )(["\']?[^>]*>)?!';