php - 自动链接正则表达式

标签 php regex url

我正在使用 PHP 函数自动将文本字符串中的 URL 转换为人们可以点击的实际链接。它似乎在大多数情况下都有效,但我发现在某些情况下它不起作用。

我根本不懂正则表达式,所以我希望有人能帮我解决这个问题。

这是我目前使用的模式:

$pattern = "/(((http[s]?:\/\/)|(www\.))(([a-z][-a-z0-9]+\.)?[a-z][-a-z0-9]+\.[a-z]+(\.[a-z]{2,2})?)\/?[a-z0-9.,_\/~#&=;%+?-]+[a-z0-9\/#=?]{1,1})/is";

但是这里有一些链接我发现这个模式不匹配:

  • www.oakvilletransit.ca - 不确定,但由于两个字母的国家/地区代码,假设它不匹配
  • www.grt.ca - 另一个无法使用 .ca 域的网站
  • 其他几个 .ca 地址
  • freepublictransports.com - 没有 www 的地址。或 http://在他们面前。我希望这些也能发挥作用。
  • www.222tips.com - 假设地址开头的数字不匹配。

有谁知道我如何修改正则表达式模式以匹配这些情况?

编辑 - 它也应该匹配末尾可能有句点的 URL。如果 URL 是句子的最后一部分,则末尾可能有一个句点,不应包含在实际链接中。目前,这种模式也考虑到了这一点。

EDIT 2 - 我正在使用这样的模式:

$pattern = "/((http|https):\/\/)?([a-z0-9-]+\.)?[a-z][a-z0-9-]+(\.[a-z]{2,6}){1,3}(\/[a-z0-9.,_\/~#&=;%+?-]*)?/is";
  $string = preg_replace($pattern, " <a target='_blank' href='$1'>$1</a>", $string);
  // fix URLs without protocols
  $string = preg_replace("/href='www/", "href='http://www", $string);
  return $string;

最佳答案

以下正则表达式将匹配 URL:

  • (可选)使用 http://https://
  • (可选)带有子域( www.example.comhelp.example.com 等)
  • 具有 1-3 个域扩展名,每个扩展名必须为 2-6 个字符(www.example.com.guwww.example.com.au.museum 等)
  • (可选)在末尾使用正斜杠
  • (可选)在正斜杠后包含有效字符

末尾的 /i 使其不区分大小写

/((http|https):\/\/)?([a-z0-9-]+\.)?[a-z0-9-]+(\.[a-z]{2,6}){1,3}(\/[a-z0-9.,_\/~#&=;%+?-]*)?/is

编辑:这不会匹配末尾的任何“悬挂”句点(例如句子的末尾),因为它不是 URL 的一部分,不应包含在 href 中链接的属性。

编辑 2:在您的第一个 preg_replace() 中,将 $1 更改为 $0。这将插入整个匹配的字符串,而不是它的单个部分。

编辑 3:(更新 2)这是一种更好的方法,您可以在开头检查 http://https://:

preg_replace("/href='[^h][^t][^t][^p][^s]?[^:]/", "/href='http:\/\/", $string);

关于php - 自动链接正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10874703/

相关文章:

php - 页面系统,其中类别 = 1

php - 如何在杀死 php 脚本后杀死 passthru 进程?

php - PHP Laravel框架中的whereRaw是什么意思

ruby - 如何拆分包含 Ruby 中的集合的字符串?

javascript - 使用 js 更改 url 参数,无需在单击按钮时重新加载页面

php - MYSQL中通过php查询

javascript - 匹配由单个空格分隔的单词,开头或结尾没有空格

regex - Lookbehind 和 Lookaround 概念在 TCL 正则表达式引擎中有用吗?

javascript - 如何用javascript捕获url字符串的一部分

iOS - 使用 URL 方案打开某些 View Controller