我正在为我的博客站点使用正则表达式模式,将 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.com或filename.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 而没有其他内容?
提前致谢。
这个正则表达式绝对不完美,但会做你想要的:
(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,但这不能被滥用。智能性的提高大大增加了复杂性。