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

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

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

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

  1. Начинается с http или тега привязки. Я считаю, что URL-адреса в тегах [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 (хотя я немного почитал и собираюсь продолжить).

Спасибо.


person mme42    schedule 09.12.2009    source источник


Ответы (3)


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

person Joey    schedule 09.12.2009
comment
Отлично, я и забыл про эту функцию. - person fregante; 02.01.2011

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

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

$good_url = filter_var( filter_var( $raw_url, FILTER_SANITIZE_URL), FILTER_VALIDATE_URL);
person Arno    schedule 09.12.2009

Хм, мое первое предположение: вы поместили $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]:   )(["\']?[^>]*>)?!';
person Boldewyn    schedule 09.12.2009