0

我正在使用以下模式来捕获链接,并将它们转换为 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>]

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

4

2 回答 2

0

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

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

更新

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

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

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

我没有直接使用 PHP 正则表达式的经验,但是上面的内容足够简单和通用,我不会想到任何问题。您可能希望对其进行一些修改以仅提取域,就像您似乎使用当前的正则表达式一样。

于 2013-01-19T02:29:09.897 回答
0

好的,我解决了这个问题。感谢@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);

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

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

于 2013-01-22T02:26:44.220 回答