【问题标题】:preg_replace_callback pattern issuepreg_replace_callback 模式问题
【发布时间】:2013-01-02 19:48:11
【问题描述】:

我正在使用以下模式来捕获链接,并将它们转换为 HTML 友好链接。我在 preg_replace_callback 中使用了以下模式,并且大部分情况下它都有效。

"#(https?|ftp)://(\S+[^\s.,>)\];'\"!?])#"

但是当文本这样读时,这种模式就失败了:

http://mylink.com/page[/b]

此时它捕获了 [/b 有趣的是它是链接的一部分,结果如下:

<a href="http://woodmill.co.uk[/b">woodmill.co.uk[/b</a>]

我已经查看了模式,并使用了一些备忘单来尝试了解正在发生的事情,但这让我很困惑。你们中的任何人都可以编码忍者的帮助吗?

【问题讨论】:

  • 你能用简单的语言解释一下你的匹配标准是什么吗?您是否打算简单地捕获 URL 中存在非法字符(即 URL 中不允许出现)的部分,因为您的 URL 后面不一定有空格?
  • @MikeBrant 简单来说,我想捕获一个 url,只要它不以句号或逗号结尾。所以mydomain.com/page 可以,但是mydomain.com/page。会失败。它旨在成为 CMS 的一部分,我在发布这个问题后不久就找到了解决方案(doh!),我在这个问题上发现了一个新的长度模式:link
  • 您应该发布您的问题的答案您的问题,而不是其他人的问题。
  • @Cyborgx37 也许,但在对另一个问题的模式进行进一步测试后,我发现它仍然中断。所以这毕竟不是一个解决方案。

标签: php regex preg-replace-callback


【解决方案1】:

尝试将左方括号添加到您的字符类:

(\S+[^\s.,>)[\];'\"!?])
            ^

更新

试试这个更有效的 URL 正则表达式:

^(https?://)?([\da-z\.-]+)\.([a-z\.]{2,6})([/\w \.-]*)*/?$

(来自:http://net.tutsplus.com/tutorials/other/8-regular-expressions-you-should-know/

我没有直接使用 PHP 正则表达式的经验,但以上内容足够简单和通用,我不认为会出现任何问题。您可能需要对其进行一些修改以仅提取域,就像您使用当前的正则表达式一样。

【讨论】:

    【解决方案2】:

    好的,我解决了这个问题。感谢@Cyborgx37 和@MikeBrant 的帮助。这是解决方案。

    首先,我将我的正则表达式模式替换为 João Castro 在这个问题中使用的模式:Making a url regex global

    该模式的问题在于它在末尾捕获了任何尾随点,因此在模式的最后部分我添加了^.,使最后部分看起来像[^\s^.]。在我阅读时,不要匹配尾随空格或点。

    这仍然导致我上面提到的匹配 bbcode 的问题,所以我使用 preg_replace_callback() 和 create_function() 将其过滤掉。最终的 create_function() 看起来像这样:

    create_function('$match','
                    $match[0] = preg_replace("/\[\/?(.*?)\]/", "", $match[0]);
                    $match[0] = preg_replace("/\<\/?(.*?)\>/", "", $match[0]);
                    $m = trim(strtolower($match[0]));
                    $m = str_replace("http://", "", $m);
                    $m = str_replace("https://", "", $m);
                    $m = str_replace("ftp://", "", $m);
                    $m = str_replace("www.", "", $m);
    
                    if (strlen($m) > 25)
                    {
                        $m = substr($m, 0, 25) . "...";
                    }
    
                    return "<a href=\"$match[0]\" target=\"_blank\">$m</a>";
    '), $string);
    

    到目前为止的测试看起来不错,所以我很高兴它现在已经解决了。

    再次感谢,我希望这对其他人有帮助:)

    【讨论】:

      猜你喜欢
      • 2010-12-26
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 2015-04-19
      • 2014-02-11
      相关资源
      最近更新 更多