当前位置: 首页 > 知识库问答 >
问题:

仅匹配以“www”或“http(s):/”开头的URL,不匹配其他内容

姚淳
2023-03-14

我正在为我的博客站点使用正则表达式模式,使URL地址成为可点击的链接,这非常有效。该模式具有以下格式:

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

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

我试图实现的是匹配除最后一个示例(见下图)之外的所有URL格式,因此mysite。com文件名。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       |
+--------------------------+------------------------------------------------------+

输入不应匹配的内容:

+-------------------+--------------------------------------------------+
|      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               |
+-------------------+--------------------------------------------------+

URL格式是什么样子的?

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

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

示例:

google.com, google.co.uk, accounts.google.com, google.com/somepath/ ...

A尝试添加www\ 字符串插入此模式,但未找到匹配项。那么,如何编辑此正则表达式以匹配以“www”或“http(s):/”开头的URL,而不是其他URL?

提前感谢。


共有1个答案

呼延升
2023-03-14

此regexp绝对不是完美的,但可以满足您的要求:

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

它可以被欺骗以匹配非URL,但这不能被滥用。增加智能性会大大增加复杂性。

 类似资料:
  • 问题内容: 我根本不擅长正则表达式。 到目前为止,我一直在使用许多框架代码,但是我找不到能够与URL匹配但也可以捕获诸如和的代码。 任何帮助都会很棒。谢谢你们! 问题答案: 为了匹配所有类型的URL,以下代码应该起作用: 然后,检查正则表达式的正确方法如下:

  • 问题 你需要通过指定的文本模式去检查字符串的开头或者结尾,比如文件名后缀,URL Scheme等等。 解决方案 检查字符串开头或结尾的一个简单方法是使用 str.startswith() 或者是 str.endswith() 方法。比如: >>> filename = 'spam.txt' >>> filename.endswith('.txt') True >>> filename.starts

  • 我正在尝试将下面的文本与ANTLR语法匹配: ANTLR语法是: 我得到的错误是: 我猜语法是合理的,但为什么会出现错误呢? null 要匹配的文档: 语法1: 在语法1中,跳过了T1,但不跳过T2中的T1部分。T2将在lexer阶段匹配输入文本。(即使我们把T2放在T1之后,T2还是会匹配的。我认为ANTLR为了最长的令牌做了一些贪婪的匹配。) 因此,正如@macmoonshine所说,我确实必

  • 问题内容: 我有以下仅允许字母的正则表达式: 如何使用p {L}(通用-任何语言,例如德语,英语等)来执行此操作 我试过了 但所有字母a =“ aB”均返回null 问题答案: 从ECMAScript2018开始,JavaScript终于原生支持Unicode属性转义。 对于较旧的版本,您要么需要自己定义所有相关的Unicode范围。或者,您可以将StevenLevithan的程序包与Unicod

  • 我正在尝试使用以下需求比较Soap UI和Wiremck的能力(这对于我的项目中的大多数情况来说是足够现实的)。 目标是为货币价格服务创建一个模拟。要求: > mytesthost/priceservice/getprice 期望一个称为'cur'的参数,它定义当前对,如:cur=EURHUF 当按如下方式调用时,应该使用保存在文件EURHUF中的XML响应进行响应。xml。 mytesthost

  • 问题内容: 我试图模糊匹配两个csv文件,每个文件包含一列名称,它们相似但不相同。 到目前为止,我的代码如下: 输出如下: 该脚本工作正常。输出是预期的。但是我所寻找的只是最佳的匹配。 因此,我需要基于第2列中的最大值,以某种方式删除第1列中的重复名称。这应该相当简单,但是我似乎无法弄清楚。任何帮助,将不胜感激。 问题答案: Fuzzywuzzy会以反向排序的顺序返回列表,最佳匹配排在最前面。 因