2013-01-19 38 views
0

我使用以下模式拍摄的链接,并将其转化为HTML友好的联系。我在preg_replace_callback中使用以下模式,并且大部分工作。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>] 

我过目模式,并使用了一些作弊表,试图跟着发生了什么,但它已经大感迷惑我。你们谁可以编码忍者的帮助吗?

+0

你能在平实的语言您匹配的标准是什么解释?您是否打算简单地捕获URL的部分,直到存在非法字符(即URL中不允许),因为您的URL不一定具有空格后面的空格? –

+0

@MikeBrant简单来说,我只想捕捉一个url,只要它不以句号或逗号结尾。所以http://mydomain.com/page会很好,但是http://mydomain.com/page。会失败。它的目的是成为一个CMS的一部分,我也张贴了这个问题(DOH!)中,我发现这个问题的一个新的长度模式的形式后不久,找到一个解决方案:[链接](HTTP://计算器。com/questions/12352635/making-a-url-regex-global/14410248#14410248) – mattauckland

+0

你应该回答你的问题**到你的问题**,而不是别人的问题。 – JDB

回答

0

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

首先我替换为若昂卡斯特罗在这个问题中使用的我的正则表达式模式: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); 

测试到目前为止正在寻找好的,所以我很高兴它现在解决了。

再次感谢,我希望这可以帮助别人:)

0

尝试添加左方括号,以你的性格类:

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

UPDATE

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

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

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

我直接用PHP正则表达式的经验,但上面是简单和通用,以至于我不希望任何问题。您可能需要修改它以提取域,就像您使用当前的正则表达式一样。

+0

即使不起作用,仍会导致相同的问题。 – mattauckland

+0

@mattauckland - 更新了答案。 – JDB