1

我正在尝试为 vBulletin 组合一个插件,以过滤掉指向文件共享站点的链接。但是,我相信你经常听到,我是 php 的新手,更不用说正则表达式了。

基本上,我正在尝试组合一个正则表达式并使用 preg_replace 来查找来自这些域的任何 url,并将整个链接替换为不允许它们的消息。我希望它能够找到链接,无论它是超链接的、作为纯文本发布的还是包含在 [CODE] bb 标签中的。

至于正则表达式,我认为我需要它来查找具有以下内容的 URLS:

  1. 以 http 或锚标记开头。我相信 [CODE] 标签中的 URLS 可以像纯文本 URLS 一样被处理,如果之后替换结束在 [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 链接的任何建议(尽管我已经阅读了一些内容,我将继续)。

谢谢。

4

3 回答 3

1

您可以parse_url在 URL 上使用并查看它返回的哈希图。这使您可以过滤域甚至更细粒度的控制。

于 2009-12-09T10:24:12.590 回答
1

我认为您可以避免使用filter_var内置函数的开销。

您可以从 PHP 5.2.0 开始使用此功能。

$good_url = filter_var( filter_var( $raw_url, FILTER_SANITIZE_URL), FILTER_VALIDATE_URL);
于 2009-12-09T10:24:35.507 回答
0

嗯,我的第一个猜测:你$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]:   )(["\']?[^>]*>)?!';
于 2009-12-09T10:21:00.783 回答