PHP regex,用于过滤特定域中的URL,以便在vBulletin插件中使用

2022-03-22 00:00:00 regex php preg-replace

我正在尝试为vBullett组合一个插件,以便过滤输出指向文件共享站点的链接。但是,正如您经常听到的那样,我是php的新手,更不用说regex了。

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

至于regex,我想我需要它来查找具有以下内容的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(尽管我已经读了一些,我将继续)。

谢谢。


解决方案

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

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

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

相关文章