1

我正在尝试更改字符串的出现,例如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 链接)

4

3 回答 3

1

您的怪异角色类别有问题:

 [[a-z0-9]/]

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

你的意思是写:

 [a-z0-9/]
于 2013-01-18T00:26:09.853 回答
0

用这个:

$x = preg_replace('#http://[?=&a-z0-9._/-]+#i', '<a target="_blank" href="$0">$0</a>', $text);
于 2013-01-18T00:27:41.083 回答
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 个字符等),所以我只是想我会给你最简单的匹配的模式。

于 2013-01-18T00:29:53.433 回答