【问题标题】:Regex to validate a texarea input which must be URLs separated by new lines正则表达式验证文本区域输入,该输入必须是由新行分隔的 URL
【发布时间】:2013-11-22 04:57:05
【问题描述】:

我正在尝试创建一个正则表达式,最终将与 Google 表单一起使用以验证 texarea 输入。

规则是,

  • 输入区域可以有一个或多个 URL(http 或 https)
  • 每个 URL 必须用一个或多个新行分隔
  • 包含文本的每一行都必须是一个有效的 URL
  • 最后一个 URL 后面可能有也可能没有换行符

到目前为止,我已经写了这个正则表达式^(https?://.+[\r\n]+)*(https?://.+[\r\n]+?)$ 但问题是如果一行有多个 url,它也会验证这一点

这是我的测试场地:http://goo.gl/YPdvBH

【问题讨论】:

  • 我认为你需要m flag
  • 我不能使用'm'标志。 texarea 中的整个输入被认为是一个应该匹配模式的输入。
  • @WaqarAhmad - 你真的很接近你的正则表达式。请参阅下面的答案。

标签: javascript regex google-forms


【解决方案1】:

这就是你要找的东西

DemoDemo with your URLS

    function validate(ele) {
        str = ele.value;
        str = str.replace(/\r/g, "");
        while (/\s\n/.test(str)) {
            str = str.replace(/\s\n/g, "\n");
        }
        while (/\n\n/.test(str)) {
            str = str.replace(/\n\n/g, "\n");
        }
        ele.value = str;

        str = str.replace(/\n/g, "_!_&_!_").split("_!_&_!_")

        var result = [], counter = 0;

        for (var i = 0; i < str.length; i++) {
            str[i] = str[i].replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g, '').replace(/\s+/g, ' ');
            if(str[i].length !== 0){
            if (isValidAddress(str[i])) {
                result.push(str[i]);
            }
            counter += 1;
            }
        }

        function isValidAddress(s) {
            return /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(s)
        }
        return (result.length === str.length);
    }
    var ele = document.getElementById('urls');
    validate(ele);

【讨论】:

  • 我绝对不需要 JavaScript 解决方案。我只需要一个正则表达式来验证 Google Form TextArea 中的文本。无论如何,感谢您的宝贵时间。
  • 我无法对问题投反对票,因为我的分数不足以获得许可。但会这样做。如果您不需要 JS 解决方案,我可以知道您为什么在问题中提到 JS 标签。
  • 因为他需要一个 Javascript 正则表达式。请注意,并非所有语言都是平等的。有些语言有非常强大的正则表达式,可能不一定适用于其他语言。
  • 因为我需要 Javascript 正则表达式而不是 javascript 解决方案,所以当您在 unix/perl/.net 或其他语言中使用正则表达式时几乎没有区别。仅向您展示一个示例,正则表达式 regular-expressions.info/refcharacters.html 中使用的特殊字符和不可打印字符的区别。还有许多其他差异。
【解决方案2】:

这更接近您正在寻找的正则表达式:

^(https?://[\S]+[\r\n]+)*(https?://[\S]+[\r\n]+?)$

你的正则表达式和这个正则表达式的区别在于你使用.+,它将匹配除换行符之外的所有字符,而我使用[\S]+(注意它是一个大写 S),它将匹配所有字符非空白字符。因此,这与一行中的多个标记不匹配。因此,在每一行上,您最多可以匹配一个标记,并且必须是 您已定义的形式

对于匹配单个 URL 的正则表达式,请查看 StackOverflow 上的这个问题:

我不知道 google-forms 是否有长度限制。但如果他们有,它肯定会几乎反弹。

【讨论】:

  • 现在好多了,但是如果 URL 没有任何空格/逗号等连接怎么办。这将无法验证。无论如何,这给了我更多改进我的正则表达式的想法。感谢并喜欢您对语法的编辑
【解决方案3】:

如果我理解正确 - 在你的正则表达式中缺少多行的 m 标志,所以你需要这样的东西

/^(https?://.+this your reg exp for one url)$/m

来自Javascript URL validation regex的正则表达式示例

/^(ht|f)tps?:\/\/[a-z0-9-\.]+\.[a-z]{2,4}\/?([^\s<>\#%"\,\{\}\\|\\\^\[\]`]+)?$/m

【讨论】:

  • 我不确定你是否理解我的问题。在 Google 表单中,我无法指定 multiline(m) 标志。我可以输入模式。文本区域中的整个文本应与模式匹配为一个。例如,我在问题中引用的正则表达式可以将 URL 与一行或多行作为一个整体进行匹配。只有一个问题,如果该行有多个 URL,它也会匹配整个文本。
  • @WaqarAhmad 是的,你说得对,我没有正确理解 :-)
猜你喜欢
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多