用于替换 http 和 https 链接的正则表达式

Regex to replace http AND https links

提问人:Henrik Petterson 提问时间:3/21/2017 更新时间:3/21/2017 访问量:1682

问:

我有以下功能定位链接:preg_replace()

$link = preg_replace(
    "#http://([\S]+?)#Uis", '<a href="http://\\1">(link)</a>', 
    $link
);

它适用于链接,显然不适用于链接。我怎样才能调整它,以便它也适用于链接。httphttpshttps

php 正则表达式 preg-replace

评论


答:

5赞 Wiktor Stribiżew 3/21/2017 #1

只需在之后添加并匹配整个链接,然后使用反向引用从替换模式中引用它:s?http$0

$link = preg_replace(
    "#https?://\S+#i", '<a href="$0">(link)</a>', 
    $link
);

查看 PHP 演示

细节

  • https?- 或httphttps
  • ://- 文字字符序列
  • \S+- 一个或多个非空格符号
  • i- 不区分大小写的修饰符。

请注意,修饰符令人困惑(会写成 ,并且模式会变长),我建议删除它。U???

如果图案中没有修饰符,则修饰符没有意义,因此它也是多余的,我建议也将其删除。s.

评论

1赞 Henrik Petterson 3/21/2017
我从正则表达式中学到的几乎所有东西都是通过你在这里的回答。非常感谢。我有一个问题。有没有办法以正确识别 URL 部分的方式调整正则表达式。例如,如果您明白我的观点,以下内容将在 URL 中添加该部分。$link = 'hello http://example.com) world';)
1赞 ManzoorWani 3/21/2017
为什么不在替代品中使用?<a href="$0">(link)</a>
0赞 Wiktor Stribiżew 3/21/2017
我认为有必要保留原始捕获。是的,也许,不再需要它了。
0赞 ManzoorWani 3/21/2017
@HenrikPetterson,您可以使用否定字符类来转义您不想匹配的字符。例如\S[^\s\)]