【问题标题】:javascript Reg Exp to match specific domain namejavascript正则表达式匹配特定域名
【发布时间】:2015-12-20 05:08:06
【问题描述】:

我一直在尝试制作一个 Reg Exp 来匹配带有特定域名的 URL。

所以如果我想检查这个 url 是否来自 example.com 什么 reg exp 应该是最好的?

这个正则表达式应该匹配以下类型的 URL:

http://api.example.com/...
http://preview.example.com/...
http://www.example.com/...
http://purhcase.example.com/...

只是简单的规则,比如http://{something}.example.com/{something} 然后应该通过。

谢谢。

【问题讨论】:

  • 到目前为止您尝试过什么正则表达式?向我们展示您的代码,让我们从那里帮助您
  • 您的问题不清楚。 http://www.example.com/www 匹配但 http://www.example.com/subdomain 不匹配吗?模式在正则表达式中占主导地位,所以最好清楚。一些反例也有帮助。

标签: javascript regex


【解决方案1】:

我想这就是你要找的东西:(https?:\/\/(.+?\.)?example\.com(\/[A-Za-z0-9\-\._~:\/\?#\[\]@!$&'\(\)\*\+,;\=]*)?)

分解如下:

  • https?:\/\/ 匹配 http://https://(你没有提到 https,但这似乎是个好主意)。
  • (.+?\.)? 匹配第一个点之前的任何内容(我将其设为可选,例如,http://example.com/ 会被发现
  • example\.com(当然是example.com);
  • (\/[A-Za-z0-9\-\._~:\/\?#\[\]@!$&'\(\)\*\+,;\=]*)?):斜杠后跟 URL 中每个可接受的字符;我将此设置为可选,以便找到http://example.com(没有最后的斜线)。

示例:https://regex101.com/r/kT8lP2/1

【讨论】:

  • 我正在寻找一个类似的正则表达式,除了一种情况外,它可以工作。如果我有一个像 example.coms 这样的字符串,它仍然匹配。如何修改正则表达式,使其不匹配除 example.com 之后的 / 之外的任何字符。有效示例:example.com/abc/ 无效示例:example.comaaa example.com.us
  • 正如@Frenz 评论的那样,这也将与example.commmmmmmm 匹配,我尝试添加开始字符和结束字符,但它根本不匹配,有人找到解决方案吗?
【解决方案2】:

使用indexOf javascript API。 :)

var url = 'http://api.example.com/api/url';

var testUrl = 'example.com';

if(url.indexOf(testUrl) !== -1) {
    console.log('URL passed the test');
} else{
    console.log('URL failed the test');
}

编辑:

为什么使用indexOf 而不是Regular Expression

你看,你在这里匹配的是一个简单的字符串(example.com)而不是pattern。如果你有一个固定的字符串,那么不需要通过检查模式来引入语义复杂性。

正则表达式最适合判断模式是否匹配。

例如,如果您的要求是域名应以ex 开头并以le 结尾,并且介于开头和结尾之间,则它应包含字母数字字符,其中4 个字符必须为大写。这是正则表达式被证明是有益的用例。

你的问题很简单,所以没有必要动用 1000 名天使的军队来说服一个爱你的人。 ;)

【讨论】:

  • 好吧,它甚至只是通过了 example.com。我需要的正是这个:http://{something}.example.com/{something} 你看,那里必须有 http。只需为您的答案投票 +1。
  • 正是我需要的,但可以想到indeOf()。我喜欢您在此处提供的开箱即用的解决方案 :)
【解决方案3】:

使用这个:

/^[a-zA-Z0-9_.+-]+@(?:(?:[a-zA-Z0-9-]+\.)?[a-zA-Z]+\.)?
(domain|domain2)\.com$/g

匹配您选择的特定域。

如果您只想匹配一个域,请从 (domain|domain2) 部分中删除 |domain2

它会帮助你。 https://www.regextester.com/94044

【讨论】:

    【解决方案4】:

    不确定这是否适用于您的情况,但依赖内置 URL 解析器而不是使用正则表达式可能会更好。

    var url  = document.createElement('a');
    url.href = "http://www.example.com/thing";
    

    然后您可以使用 API 提供给您的值调用这些值

    url.protocol // (http:)
    url.host     // (www.example.com)
    url.pathname // (/thing)
    

    如果这对您没有帮助,类似这样的方法可能会起作用,但可能太脆弱了:

    var url     = "http://www.example.com/thing";
    var matches = url.match(/:\/\/(.[^\/]+)(.*)/);
    
    // matches would return something like
    // ["://example.com/thing", "example.com", "/thing"]
    

    这些帖子也可以提供帮助:

    https://stackoverflow.com/a/3213643/4954530

    https://stackoverflow.com/a/6168370

    祝你好运!

    【讨论】:

      【解决方案5】:

      在某些情况下,您要查找的域实际上可以在查询部分中找到,但在域部分中找不到:https://www.google.com/q=www.example.com

      This answer 会更好地处理这种情况。
      请参阅 regex101 上的 this example

      【讨论】:

        【解决方案6】:

        正如你所指出的,你只需要 example.com(写域然后转义句点然后 com),所以在正则表达式中使用它。

        Example

        更新

        请看下面的答案

        【讨论】:

        • 是的。你说得对。但我认为正则表达式甚至可以包含整个提到的模式,例如 http://{something}.example.com/{something}。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多