PHP preg_replace - www or http://

3

我遇到了一个看似简单的问题。我有一个聊天框/喊话框,其中可能输入任意 URL。我想找到每个独立的 URL(由空格分隔),并将其用标签包裹起来。

示例:Harry you're a http://google.com wizard! = Harry you're a $lhttp://google.com$l wizard!

示例:Harry you're a http://www.google.com wizard! = Harry you're a $lhttp://www.google.com$l wizard!

示例:Harry you're a www.google.com wizard! = Harry you're a $lwww.google.com$l wizard!

如果这个问题很傻,请不要介意;我只是想让某些东西工作,我不是 php 专家 :(


正则表达式应该是/(http:\/\/)(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ - Ibu
当我使用以下代码:$chat = preg_replace($old_words, $new_words, $chat);我得到的结果是:$lhttp://$l其中$oldwords是:'/(http://)(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(/|/([\w#!:.?+=&%@!-/]))?/'而$new_words是:'$l$1$l' - Matthew
1
请尝试在您的问题中添加此注释。 - Ibu
你有一个语法错误,应该是 你是个巫师,哈利 - esqew
我看到你做的了,我喜欢它 ;) - Matthew
3个回答

14

有一篇关于URL正则表达式的有趣文章。在PHP中,它看起来像这样:

$pattern = "/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))/";

$inp = "Harry you're a http://google.com wizard!";
$text = preg_replace($pattern, "[supertag]$1[/supertag]", $inp);

当然,要用适当的值替换[supertag][/supertag]


如果这对您有用,请将其标记为已接受的答案,以便帮助其他遇到同样问题的人。 - Bryan
当我复制/粘贴您的模式时,最后会以某种方式得到 «»“”‘’ 这些引号在中间被转换为普通引号。 我使用 Dreamweaver。有什么建议吗?谢谢。 - Sasho
这会转换所有的URL,而不仅仅是被空格包围的URL。因此,它会破坏用户实际输入HTML封闭的URL链接。 - Angie Jones

1

你需要使用所谓的正则表达式

你应该编写一个正则表达式,然后使用PHP的各种正则表达式函数来完成你想要的操作。

在这种情况下,你应该使用preg_replace()函数,它会查找与你的正则表达式匹配的字符串,并按照你指定的方式进行替换。

你要寻找的正则表达式特别难以编写,因为URL可以有很多形式,但我找到了一个可以解决问题的表达式:

$text = "derp derp http://www.google.com derp";
$text = preg_replace(
  '@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@',
  '[yourtag]$1[/yourtag]',
  $text
);
echo $text;

这将输出:

derp derp [yourtag]http://www.google.com[/yourtag] derp

您可以看到,preg_replace() 函数在 $text 中找到了 URL(可能有多个),并将我指定的标签放在其中。


这个方向是正确的,我想这会完成任务,谢谢!唯一的问题是,如果URL前面没有空格,它仍然会尝试处理它,有没有办法只在URL与其他单词分开时才处理它? - Matthew

1
$text = " Helloooo try thiss http://www.google.com and www.youtube.com :D it works :)";

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

$regex = "#[ ]+(www.([a-z0-9._-]+))#i";

$text = preg_replace($regex," <a href='http://$1'>$1</a>",$text);

echo $text;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接