转换字符串内部发生的链接

时间:2013-01-18 00:19:25

标签: php regex preg-replace

我正在尝试更改字符串出现,例如http://www.bbc.co.uk/以便它出现在html链接中,例如<a href="http://www.bbc.co.uk/">http://www.bbc.co.uk</a>

但由于某种原因,我的正则表达式转换不起作用。有人可以指点我正确的方向吗?

$text = "I love this website http://www.bbc.co.uk/";
$x = preg_replace("#[a-z]+://[^<>\s]+[[a-z0-9]/]#i", "<a href=\"\\0\" target=\"_blank\">\\0</a>", $text);
var_dump($x);

输出我喜欢这个网站http://www.bbc.co.uk/(没有HTML链接)

3 个答案:

答案 0 :(得分:1)

你奇怪的角色类是错的:

 [[a-z0-9]/]

双方括号用于POSIX字符类,如[[:digit:]]

你只想写:

 [a-z0-9/]

答案 1 :(得分:0)

使用此:

$x = preg_replace('#http://[?=&a-z0-9._/-]+#i', '<a target="_blank" href="$0">$0</a>', $text);

答案 2 :(得分:0)

这是因为你的正则表达式给你一个匹配(实际上它甚至不会给你一个匹配,因为你根本不接受域名中的句点)。尝试这样的事情:

$pattern = '#https?://.*\b#i';
$replace = '<a href="$0" target="_blank">$0</a>';
$x = preg_replace($pattern, $replace, $text);

请注意,我实际上并没有尝试在此处验证URL格式,所以我只接受http()://之类的任何内容,直到下一个单词边界。看起来好像你没有使用真正的URL验证正则表达式(即验证至少有一个.,TLD组件有2-6个字符等),所以我只是想我会给你最简单的模式。