【问题标题】:JavaScript to remove whatever is after the tld and before the whitespaceJavaScript 删除 tld 之后和空格之前的所有内容
【发布时间】:2015-08-13 09:42:23
【问题描述】:

我有一堆函数可以将页面过滤到附加到电子邮件地址的域中。一切都很好,除了一件小事,一些链接是这样出来的:

EXAMPLE.COM
示例.ORG.
示例.ORG>.
示例.COM"
示例.COM"。
示例.COM)。
示例.COM(评论)“
DEPT.EXAMPLE.COM
示例.ORG
示例.COM。

我想找出最后一个过滤器(无论是否为正则表达式),它将删除 TLD 之后的所有内容。所有这些项目都在一个数组中。

编辑

我正在使用的功能:

function filterByDomain(array) {
    var regex = new RegExp("([^.\n]+\.[a-z]{2,6}\b)", 'gi');
    return array.filter(function(text){
        return regex.test(text);
    });
}

【问题讨论】:

  • 我会这样做,(.+)\.[\w]。这将搜索到最后一个句点,其后有一个单词字符。这会将二级域保留在外部域中,例如ac.ukac 将保留。
  • @mascaliente:我根据您的编辑提供了我的答案的更新。

标签: javascript regex


【解决方案1】:

您可能可以使用此正则表达式来匹配每种情况下的 TLD:

/^[^.\n]+\.[a-z]{2,63}$/gim

RegEx Demo

你的验证函数可以是:

function filterByDomain(array) {
    var regex = /^[^.\n]+\.[a-z]{2,63}$/gim;
    return array.filter(function(text){
        return regex.test(text);
    });
}

PS:请阅读此Q & A to see that up to 63 characters are allowed in TLD.

【讨论】:

  • 出于某种原因,\b 正在破坏我的代码。我正在使用我正在使用的功能更新我的问题
  • 哦,不要使用RegExp 构造函数(这需要\\b 顺便说一句)。只需使用var regex = /([^.\n]+\.[a-z]{2,3}\b)/gi
  • 请注意,TLD 后面的点实际上是 FQDN 的有效(严格来说是必需的)部分。
  • .[a-z]{2,3} 不是一个好主意:有 .info 甚至通用顶级域
  • 编辑后,您只需将 OP 问题中的 {2,6} 范围替换为 {2,5}。先生,您绝对确定这可以回答问题吗?
【解决方案2】:

我会匹配所有前导 [\w.] 并省略最后一个点(如果有):

var result = url.match(/^[\w\.]+/).join("");
if(result.slice(-1)==".") result = result.slice(0,-1);

注意\w 应该被替换为更复杂的东西:

  • _\w 集合的一部分,但不应在 url 路径中
  • - 不是\w 的一部分,但可以在不与.- 相邻的网址中

为了保持正则表达式的简单和代码的可读性,我会这样做

  1. _替换url中的##_都只能在TLD之后)
  2. - 替换__\w 的一部分)
  3. 在正则表达式测试之后,用_ 替换-

www.-example-.com 之类的 URL 仍然可以通过,可以通过搜索 [.-]{2,} 来检测

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-13
    • 2022-11-07
    • 2021-10-15
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2014-06-22
    • 2016-05-11
    相关资源
    最近更新 更多