正则表达式匹配简单域名

20

我想匹配一个简单的域名:example.com

以及它的所有可能组合。

如何做到包含:

https://example.com
http://www.example.com
等等。

1
你必须使用单个正则表达式吗?使用现有的URL解析器,然后逐个查看部分会更少出错。 - mu is too short
@muistooshort еОЯжЬђжИСдљњзФ®зЪДжШѓ/^https?:\/\/.*?\.?facebook\.com\//пЉМдљЖжИСиЃ§дЄЇеЃГеПѓиГљдЄНйАВзФ®дЇОжЙАжЬЙжГЕеЖµпЉЯ - Andy
这会让一些无效的URL通过(例如http://a_b.facebook.com/),但这可能不是一个问题。 - mu is too short
你尝试了什么?你尝试时遇到了哪些问题?这不是一个教程网站,也不是一个免费的代码编写服务。请阅读https://StackOverflow.com/help/how-to-ask,然后编辑你的问题以符合SO设计处理的问题类型。 - SherylHohman
6个回答

14
^https?://([\w\d]+\.)?example\.com$

使用代码:

var result = /^https?:\/\/([a-zA-Z\d-]+\.){0,}example\.com$/.test('https://example.com');
// result is either true of false

我改进了它,使其匹配像“http://a.b.example.com”那样


1
你可能需要调整字符类。并非所有的\w都在域名中有效(特别是_),而连字符是允许的。 - mu is too short
@itea - 谢谢 - 但是你能为我添加JavaScript转义吗? - Andy
@itea 再次感谢您的帮助 - 但我仍然有问题。请参见 http://jsfiddle.net/v4WVU/ - Andy
@Andy 因为$匹配字符串/行的结尾,所以只需将其删除。使用以下代码:if (/^(?:http(?:s)?://)?(?:[^.]+.)?jsfiddle.net/.test(window.location.href)) { alert('works'); } // 这似乎在jsfiddle中不起作用,但在chrome的javascript控制台中可以正常工作。 - itea
1
你好!虽然这段代码可能解决了问题,但是加上解释为什么以及如何解决问题会真正有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并指出适用的限制和假设。如果该问题已经得到解答,则应在评论中写入指向该SO帖子的链接,或将该帖子报告为重复,而不是重新回答,以使SO按设计运行。 - SherylHohman

14

你可以使用正则表达式匹配URL中的域名部分:

/^(?:https?:\/\/)?(?:[^.]+\.)?example\.com(\/.*)?$

它将匹配以下任意字符串:

https://example.com
http://www.example.com
http://example.com
https://example.com
www.example.com
example.com

 

正则表达式演示

正则表达式细节:

  • ^: 开始位置
  • (?:https?:\/\/)?: 匹配 http:// 或者 https://
  • (?:[^.]+\.)?: 可选地 匹配紧挨着下一个点和点之前的文本
  • example\.com: 匹配 example.com
  • (\/.*)?: 可选地 匹配 / 后面零个或多个任意字符
  • $: 结尾位置

实际上它可以工作,参见:http://jsfiddle.net/v4WVU/3/ 你试图匹配的是 location.href,而它是 http://fiddle.jshell.net/_display/。如我之前所写,正则表达式是用于匹配域名而不是完整URL的。 - anubhava
2
你好!虽然这段代码可能解决了问题,但是加上解释为什么以及如何解决问题会真正有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并指出适用的限制和假设。如果该问题已经得到解答,则应在评论中写入指向该SO帖子的链接,或将该帖子报告为重复,而不是重新回答,以使SO按设计运行。 - SherylHohman
2
非常有价值的观点@SherylHohman,对于我发布此帖时没有添加解释表示歉意。现在我已经在我的回答中添加了一个可工作的演示和解释。谢谢! - anubhava

6
我使用的一个更通用的例子是:
/http(?:s)?:\/\/(?:[\w-]+\.)*([\w-]{1,63})(?:\.(?:\w{3}|\w{2}))(?:$|\/)/i

请注意,该解决方案无法正确识别5个字符的顶级域名标签。例如:
http://mylabel.co.uk

这段文本中的“co”将被识别为“mylabel”,但

http://mylabel.co

正则表达式可以正确匹配为“mylabel”。即使有这种限制,该正则表达式对我来说已经足够好了。

请注意,标签的63个字符限制是RFC规范。希望这能帮助将来寻找同样答案的任何人。


2

2
这将正确匹配以下任何变体的URL,以及.com后面的任何内容。
https://example.com
https://www.example.com
http://www.example.com
http://example.com
https://example.com
www.example.com
example.com

结果将是真或假

const result = /^(http(s)?(:\/\/))?(www\.)?example\.com(\/.*)?$/.test(value); 

1
以下表达式匹配http/https/ftp,尽管它也可以匹配随机的5个字母词,如ahfzc,但这很少会发生,并且它们将被后面的表达式忽略。
第二部分匹配ww / www,最后一部分匹配任何由“.”分隔的字母数字。最后一部分匹配任何3个字符,如.com,.in,.org等。
试一下
r'[a-z0-9]{0,5}[\:\/]+[w]{0,3}[\.]+[a-z0-9\-]+[\.]+[a-z0-9]{0,3}'

5
你好!虽然这段代码可能解决了问题,但是加上一个解释为什么以及如何解决这个问题的说明,将有助于提高你的帖子质量,并且可能会获得更多的赞。请记住,你正在回答未来读者的问题,而不仅仅是当前提问的人。请编辑你的答案添加解释,以及指出哪些限制和假设适用。如果这个问题已经有了答案,请在评论中写下SO的链接,或者将该帖子报告为重复,而不是重新回答,这样SO才能正常工作。 - SherylHohman
你的正则表达式匹配 :://:://...-...,但这不是一个有效的域名。但它无法匹配有效的域名 stackoverflow.comexample.enterprise - Toto
正确的,我们可以使用这个来包含stackoverflow.comdomain_exp = r'[a-z0-9]{0,5}[\:\/]?[w]{0,3}[\.]?[a-z0-9\-]+[\.]+[a-z0-9]{0,3}'但这会使它变得太通用,并包含很多错误的结果。你将不得不根据你获得的数据类型调整你的解决方案,因为我相信你不能通过re获得100%的准确性。在我的情况下,上面的方法效果最好。 - solve it

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接