将 www*.com 更改为具有正则表达式的可点击 URL



我正在处理一个网页,正则表达式不断成为处理我试图解决的问题的字符串操作的最佳方式。 不幸的是,正则表达式并不是微不足道的,我一直遇到麻烦。 任何帮助不胜感激;

我想将从 php 表单输入的字符串转换为可点击的链接。 我的第一个挑战得到了帮助;如何将以HTTP,HTTPS或FTP开头的字符串转换为可点击的链接;

function make_links_clickable($message){
    return preg_replace('!(((f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;//=]+)!i', '<a href="$1" target="_blank">$1</a>', $message);
}
$message = make_links_clickable($message);  

这很有效。 当我查看它(并进行一些研究)时,我能从语法中收集到的最好的东西是第一部分匹配 ftp、http 和 https、: 和//以及广泛的组合模式。 我想知道我怎么做;

1)使以www开头或以.com/.net/.org/etc结尾的链接可点击(如 google.com 或 www.google.com - 省略 http://)

2)更改YouTube链接,例如

"https://www.youtube.com/watch?v=examplevideo" 

"<iframe width="560" height="315" src="//www.youtube.com/embed/examplevideo" frameborder="0" allowfullscreen></iframe>"

我认为这两个案例基本上在做同一种事情,但弄清楚并不直观。 任何帮助将不胜感激。

第一个正则表达式用于匹配 ftp://、http://https://之后发生的几乎所有内容,因此最好将其他表达式实现为单独的表达式,因为它们只会匹配主机名。

对于第 1 个,您需要确定您希望匹配不同 TLD (.com/.net/etc) 的严格程度。例如,您可以像这样显式匹配它们:

(www.)?[a-z0-9-]+.(com|net|org)

但是,这只会匹配以 .com、.net 或 .org 结尾的 URL。如果您想要所有顶级域并且仅使用有效域,则需要手动将它们全部写入末尾。或者,您可以执行类似操作,

(www.)?[a-z0-9-]+.[a-z]{2,6}

它将接受任何看起来像 URL 并以"点"结尾的内容,以及 2 到 6 个字母(.museum 和 .travel)的任意组合。但是,这将匹配像"fgs.fds"这样的字符串。根据您的应用程序,您可能需要向[a-z]添加更多字符,以添加对扩展字符字母表的支持。

编辑(14 年 8 月 2 日):正如下面的评论中所指出的,这与 .co.uk 等 TLD 不匹配。这是一个将:

(www.)?[a-z0-9-]+.([a-z]{2,3}(.?[a-z]{2,3})?)

而不是 2 到 6 个字符之间的任何字符串(在句点之后),这将匹配任何 2 到 3,然后是另一个 1 到 3(如果存在),有或没有分隔句点。

这将是多余的,但你可以删除第二个选项上www后面的问号,然后做两个测试;这样,你可以匹配任何以通用TLD结尾的字符串,或者以"www."开头的字符串,后跟任何用一个句点分隔的字符,"gpspps.cobg"。它仍然会匹配可能实际上不存在的网站,但至少它看起来像一个网址,看起来像一个。

对于YouTube的那个,我有点问号疯狂。

(?i:(?:(?:http(?:s)?://)?(?:www.)?)?youtu(?:.be/|be.com/watch?(?:[a-z0-9_-%&=]){0,}?v=))([a-zA-Z0-9_-]{11}){0,}?v=))(?i)([a-zA-Z0-9_-]{11})

编辑:我只是尝试在我自己的一个项目中使用上述正则表达式,但我遇到了一些错误。我稍微改变了一下,我认为这个版本可能会更好:

(?i:(?:(?:http(?:s)?://)?(?:www.)?)?youtu(?:.be/|be.com/watch?(?:[a-z0-9_-%&=]){0,})?)(?:v=)?([a-zA-Z0-9_-]{11})

对于那些不熟悉正则表达式的人,括号、( ...regex... ) 存储为组,可以从匹配的字符串中选择性地挑选出来。括号组以?:开头,就像上面的大多数组一样,(?:www.)不会在组中捕获。因为正则表达式的末尾被保留为一个正常的——"捕获的"——组,([a-zA-Z0-9_-]{11}),你使用 preg_match 等函数的 $matches 参数,然后你可以使用 $matches[1] 来获取视频的 YouTube ID,"examplevide",然后随心所欲地使用它。另请注意,正则表达式仅匹配 ID 的 11 个字符。

此正则表达式将匹配几乎所有当前的 youtube 网址格式,包括不正确的大小写和(正常)顺序参数:

http://youtu.be/dQw4w9WgXcQ
https://www.youtube.com/watch?v=dQw4w9WgXcQ
http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=featured
http://www.youtube.com/watch?feature=featured&v=dQw4w9WgXcQ
http://WWW.YouTube.Com/watch?v=dQw4w9WgXcQ
http://YouTube.Com/watch?v=dQw4w9WgXcQ
www.youtube.com/watch?v=dQw4w9WgXcQ

最新更新