我需要提出一个正则表达式来从网址中仅提取domainname.extension。现在我有一个删除“www”的正则表达式。从主机名,但我需要更新正则表达式从主机名中删除任何子域名字符串:
这剥离了www。:
window.location.hostname.replace(/^www\./i, '')
但是我需要检测abc.def.test.com或ghi.test.com上的任何子域信息,用空字符串替换它并始终返回“test.com”
答案 0 :(得分:2)
你可以用替换方法获得相同的结果,但匹配是多么合适:
console.log(
window.location.hostname.match(/[^\s.]+\.[^\s.]+$/)[0]
);
[^\s.]+
匹配除点$
断言输入字符串的结尾根据评论使用替换方法:
console.log(
window.location.hostname.replace(/[^\s.]+\.(?=[^\s.]\.)/g, '')
);
答案 1 :(得分:0)
那么,这主要取决于您定义的域名以及如何定义子域名。我将使用最通用的方法将顶级域视为最后两个子组件(就像您在test.com
中使用的那样)在这种情况下,您可以继续:
([a-zA-Z0-9-]+\.)*([a-zA-Z0-9-]+\.[a-zA-Z0-9-]+) ==> $2
如您所见,正则表达式分为两组,我们只得到输出中的第二个,即最后两个域组件。 [a-zA-Z0-9-]
子表达式需要一些解释,因为它在正则表达式中出现三次:它是域组件中允许的字符集,包括-
连字符。有关正常工作的演示,请参见[1]。
如果您想要处理上一个演示中发布的co.uk
示例,要将www.test.co.uk
与test.co.uk
匹配,那么您必须将正则表达式锚定到最后(使用$
,或者如果您位于网址中间,可以使用可以跟随域名的下一个:
或/
,以避免前缀被检测为类似的有效域显示在[2]中:
(([a-zA-Z-9-]+\.)*?)([a-zA-Z0-9-]+\.[a-zA-Z0-9-]+(\.(uk|au|tw|cn))?)$ ==> $3
或[3]
(([a-zA-Z-9-]+\.)*?)([a-zA-Z0-9-]+\.[a-zA-Z0-9-]+(\.(uk|au|tw|cn))?)(?=[:/]|$) ==> $3
当然,您必须在列表中列出所有遵循使用顶级域名作为其结构前缀的惯例的国家/地区。你必须在这里小心,因为并非所有国家都遵循这种方法。我在这里使用了非贪婪的*?
运营商,好像我没有,然后小组匹配没有得到所需(第一组变得贪婪,匹配是再次在co.uk
而不是test.co.uk
)
但是当你最终锚定你的正则表达式时(主要是因为你可以在url的查询字符串部分或子路径部分中拥有域名,最好将它锚定到整个url。