Я пытаюсь собрать подключаемый модуль для vBulletin, чтобы отфильтровать ссылки на сайты обмена файлами. Но, как я уверен, вы часто слышите, я новичок в php, не говоря уже о регулярных выражениях.
В основном, я пытаюсь собрать регулярное выражение и использовать preg_replace, чтобы найти любые URL-адреса из этих доменов и заменить всю ссылку сообщением о том, что они не разрешены. Я бы хотел, чтобы он нашел ссылку, связан ли она с гиперссылкой, размещен как обычный текст или заключен в теги [CODE] bb.
Что касается регулярного выражения, мне нужно будет найти URLS со следующим, я думаю:
У меня такое чувство, что цифры 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]: )(["\']?[^>]*>)?!';