【问题标题】:PHP regex for filtering out urls from specific domains for use in a vBulletin plug-inPHP regex 用于过滤来自特定域的 url 以在 vBulletin 插件中使用
【发布时间】:2009-12-09 10:16:38
【问题描述】:

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

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

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

  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 的任何建议(尽管我已经阅读了一些内容,我将继续)。

谢谢。

【问题讨论】:

    标签: php regex preg-replace


    【解决方案1】:

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

    【讨论】:

    • 太好了,我忘记了这个功能。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案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]:   )(["\']?[^>]*>)?!';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-16
        • 1970-01-01
        • 1970-01-01
        • 2016-09-21
        • 1970-01-01
        • 2021-07-16
        • 2019-11-05
        • 1970-01-01
        相关资源
        最近更新 更多