只匹配以 'www' 或 'http(s)://' 开头的 URL,其他不匹配

Lko*_*opo 5 regex

我正在为我的博客站点使用正则表达式模式,将 URL 地址设为可点击链接,效果很好。该模式具有以下格式:

/(href=")?([-a-zA-Z0-9@:%_\+.~#?&\/\/=]{2,256}\.[a-z]{2,4}\b(\/?[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)?)/
Run Code Online (Sandbox Code Playgroud)

所以有什么问题?

但在不久的过去,我发现这种模式也匹配文件名,所以当用户在评论中发布一些文件名时,系统会将其作为链接。你可以在这里看到这个效果:

在此处输入图片说明

我正在努力实现什么?

我想要实现的是匹配除最后一个示例(见下图)之外的所有这些 URL 格式,因此mysite.comfilename.php不会突出显示。

在此处输入图片说明


输入应该匹配的内容:

+--------------------------+------------------------------------------------------+
|         Example          |                     Explanation                      |
+--------------------------+------------------------------------------------------+
| http(s)://www.mysite.com | because it starts with http(s):// and has URL format |
| www.mysite.com           | because it starts with www. and has URL format       |
+--------------------------+------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

输入不应该匹配的内容:

+-------------------+--------------------------------------------------+
|      Example      |                    Explanation                   |
+-------------------+--------------------------------------------------+
| mysite.com        | because it doesn't start with http(s):// or www. |
|                   | even it has URL format                           |
| http(s)://mytext  | because it doesn't have URL format               |
| http://localhost/ | because it doesn't have URL format               |
+-------------------+--------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

URL 格式如何?

对于这种情况,我们可以通过以下模式指定 URL 格式:

([-a-zA-Z0-9_.]{2,256}\.[a-z]{2,4}\b(\/?[-a-zA-Z0-9:%_\+.~#?&\/=]+)?))
Run Code Online (Sandbox Code Playgroud)

例子:

google.com, google.co.uk, accounts.google.com, google.com/somepath/ ...
Run Code Online (Sandbox Code Playgroud)

结论

尝试将www\.字符串添加到此模式中,但未找到匹配项。那么如何编辑此正则表达式以匹配以“www”或“http(s)://”开头的 URL 而没有其他内容

提前致谢。

Tom*_*ica 2

这个正则表达式绝对不完美,但会做你想要的

(http[s]?:\/\/|www.|ftp:\/\/){1,2}([-a-zA-Z0-9_]{2,256}\.[a-z]{2,4}\b(\/?[-a-zA-Z0-9@:%_\+.~#?&\/=]+)?)
Run Code Online (Sandbox Code Playgroud)

它可以被欺骗来匹配非 url,但这不能被滥用。智能性的提高大大增加了复杂性。