2009-12-09 3 views
1

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

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

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

  1. Запуски с HTTP или якорной тег. Я считаю, что URLS в тегах [CODE] можно обрабатывать так же, как и URL-адреса простого текста, и это нормально, если замена заканчивается внутри тега [CODE].
  2. Может содержать любое количество любых символов перед доменным/словом
  3. Has домена где-то в середине
  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 (хотя я немного прочитал, и я продолжу).

Спасибо.

ответ

0

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

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

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

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

$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]: )(["\']?[^>]*>)?!'; 
1

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

+0

Отлично, я забыл об этой функции. –

1

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

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

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