PHP正则表达式用于在vBulletin滤除来自特定站点的URL用于插件(PHP regex for

2019-09-25 15:57发布

我试图把一个插件,vBulletin过滤掉链接文件共享网站。 但是,正如我敢肯定,你经常听到,我到PHP更别说正则表达式对于新手。

基本上,我试图把一个正则表达式,并使用了preg_replace地发现,从这些领域的任何URL和替换,他们是不允许的消息整个链路。 我希望它发现无论是超链接,发布为纯文本,或包含在[CODE] BB标签的链接。

至于正则表达式,我需要它来寻找与以下网址,我认为:

  1. 与HTTP或锚标签开始。 我相信,在[CODE]该网址的代码可以处理一样的纯文本网址,并更换了[code]标签内之后结束了它的罚款。
  2. 可以包含域/字之前的任何数量的任何字符
  3. 一个地方有域在中间
  4. 可以包含域之后的任何数量的任何字符
  5. (| HTM | RAR |拉链| 001 HTML)或在闭合锚标记与一些一些推广的诸如结束。

我有一种感觉,它的号码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(虽然我读了一下,我会继续)。

谢谢。

Answer 1:

您可以使用parse_url上的网址,并观看它返回的HashMap中。 这允许您筛选域或甚至更细粒度的控制。



Answer 2:

我想你可以避免使用这种开销filter_var内置功能。

您可以使用此功能,因为PHP 5.2.0。

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


Answer 3:

嗯,我的第一个猜测:你把$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]:   )(["\']?[^>]*>)?!';


文章来源: PHP regex for filtering out urls from specific domains for use in a vBulletin plug-in