【问题标题】:Regex to match to urls正则表达式匹配 url
【发布时间】:2020-05-18 19:38:52
【问题描述】:

我正在寻找一个正则表达式来匹配以下 2 个网址:

1) https://www.youtube.com/
2) https://www.youtu.be/

当然还有查询。

1) https://www.youtube.com/watch?v=dqw4w9wgxcq&feature=youtu.be
2) http://youtu.be/dqw4w9wgxcq

我想在表单提交后检查它。

我现在的正则表达式是:

 var expression = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)?/gi;
  var regex = new RegExp(expression);

  if (!linkVal.match(regex)) {
    alert("PLease enter a valid url");
    return;
  }

提前致谢

【问题讨论】:

  • 我们需要更多信息。 只有这两个网址?无论文件夹路径有多长或嵌套多长时间,它都会捕获路径吗?他们假定 URL 是安全的吗?
  • @JoelHager 不,youtube.com 或 youtu.be 之后的所有路径。我认为所有 youtube 链接都是安全的。
  • 所以它是 所有 youtube 链接?
  • @JoelHager 喜欢所有视频链接。
  • 我会澄清一下 - 你最终对捕获的数据做了什么?如果模糊不清,您必须进行 项检查(即检查 https 或相对路径等)

标签: javascript html node.js regex


【解决方案1】:

您要查找的正则表达式是[(http(s)?):\/\/(www\.)?]{2,256}(youtube.[a-z]{2,6}|youtu.be)\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)

可能有几种情况会失败,但这在我的测试中相当稳健。让我知道是否有任何 URL 失败,我可以看看。 :)

const regex = /[(http(s)?):\/\/(www\.)?]{2,256}(youtube.[a-z]{2,6}|youtu.be)\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/;
const entries = [
'https://youtube.com',
'www.fakename.com',
'www.youtu.be/pathtoname',
'https://youtu.be/',
'http://youtabe.com/',
'https://youtube.com',
'https://www.youtube.com/watch?v=UuXWTnzacyQ',
'https://youtucan.com',
'https://youtunow.com'
];


const validUrls = entries.filter( e => e.match(regex) );
console.log(validUrls);

如果您提供 youtube 网址的示例列表,我可以证明它有效。我只是没有一个 API 来抓取 100 个左右的视频的 JSON 来检查。

【讨论】:

    【解决方案2】:

    您不应该为此使用正则表达式。使用本机 URL 对象解析 URL 并在此基础上实现您的逻辑。

    const urls = [
        'http://youtube.com/',
        'https://www.youtu.be',
        'http://www.youtu.b',
        'invalid'
    ];
    
    console.log(urls.map(url => [url, isValidUrl(url)]));
    
    function isValidUrl(urlString) {
        let url;
    
        try { url = new URL(urlString) } 
        catch { return false }
    
        return isValidProtocol() && isValidDomain();
    
        function isValidProtocol() {
            return url.protocol === 'http:' || url.protocol === 'https:';
        }
    
        function isValidDomain() {
            const coreDomain = url.hostname.replace(/^www\./, '');
    
            return coreDomain === 'youtube.com' || coreDomain === 'youtu.be';
        }
    }

    【讨论】:

    • 您不需要指定每个 TLD 吗? .co.jp/.de/.co.uk/etc.?
    • @JoelHager 好吧,OP 只指定了这 2 个,但既然 URL 已正确解析,他总是可以从这一点开始使用正则表达式(或枚举它们)。关键是要避免使用正则表达式进行核心解析。
    • 根据他的 cmets 和链接,网址是用户一次输入一个文本。
    • @JoelHager 哦,好吧,我还没有阅读所有的通讯,从这个问题来看,他想要达到的目标还不是很清楚。从他发布的代码的要点来看,他似乎正在研究验证 URL,并且使用 URL 解析器是进入 IMO 的更强大和更简单的方法,即使您使用正则表达式进行进一步的简单验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2015-09-14
    • 2021-12-31
    • 2016-12-12
    • 2012-02-04
    相关资源
    最近更新 更多