【发布时间】:2012-06-08 03:16:33
【问题描述】:
我正在使用 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 - 假设由于地址开头的数字不匹配。
有谁知道我可以如何修改该正则表达式模式以匹配这些情况?
EDIT - 它还应该匹配结尾可能有句点的 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;
【问题讨论】:
-
正则表达式提示:
[s]?不是必需的。只需使用s?。 -
正则表达式提示:
{1,1}没有任何意义。{2,2}也没有。 -
好的,我在另一个 SO 问题上找到了这段代码。所以改变[s]?到s?并且删除 {1,1} 和 {2,2} 应该没有区别吗?
-
不,没有区别。但请确保将
{2,2}替换为{2};不要只是把它拿出来。 -
Regular Expression for URL 的可能重复项