问题
我正在尝试验证 <textarea>
的内容使用 JavaScript,所以我创建了一个 validate()
函数,返回 true
或 false
文本区域内的文本是否有效。
文本区域只能包含逗号分隔的主机名。通过主机名,我的意思是像 subdomain.domain.com
,所以它基本上是一些点分隔的字符串。由于用户往往不会写得很好,我还希望允许在各种主机名和逗号之间保留任意数量的空格,但不要在主机名内。
以下是一些应该匹配或不应该匹配的示例:
应该匹配:
-
domain.com,domain2.co.vu,sub.domain.org
-
domai2n.com , dom-ain.org.co.vu.nl ,domain.it
-
dom-ain.it, domain.com, domain.eu.org.something
-
a.b.c, a.b, a.a.a , a.r
-
0191481.com
-
不应该匹配:
-
domain.com., sub.domain.it
不完整的主机名 -
domain.me, domain2
不完整的主机名 -
sub.sub.sub.domain.tv, do main.it
主机名包含空格 -
site
不完整的主机名 -
hèy.com
主机名不能包含重音符号 -
hey.01com
主机名不能以数字或包含数字的字符串结尾 -
hello.org..wow
不完整的主机名
-
到目前为止我尝试了什么
我使用以下代码构建了我的函数:
function validate(text) {
return (
(/^([a-z0-9\-\.]+ *, *)*[a-z0-9\-\.]+[^, ]$/i.test(text)
&& !/\.[^a-z]|\.$/i.test(text)
&& ~text.indexOf('.'))
);
}
不幸的是,我的功能不起作用。它无法识别不完整的主机名并返回 true
.
有什么方法可以做到这一点吗?也许不使用 RegExp,即使我更愿意使用单个 RegExp。
最佳答案
说不使用正则表达式的答案非常好,但我喜欢正则表达式:
^\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+)\s*(?:,\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+)\s*)*$
是的..它不是那么漂亮。但它有效 - 在 http://regex101.com 对您的示例案例进行了测试
编辑:好的,让我们分解一下。并且只允许 sub-domain-01.com
和 a--b.com
而不是 -.com
每个子域 thingo: \w+(?:-+\w+)*
匹配单词字符的字符串加上可选的一些前面带有破折号的单词。
每个主机名:\s*(?:(?:\w+(?:-\w+)*\.)+[a-z]+)\s*
随后是一堆子域名一个点。最后后面只跟着一串字母(tld)。当然还有两侧的可选空间。
整个事情:\s*(?:(?:\w+(?:-\w+)*\.)+[a-z]+)\s*(?:,\s*(?: (?:\w+(?:-\w+)*\.)+[a-z]+)\s*)*
单个主机名,后跟 0 个或多个 ,hostname
对于我们的逗号分隔列表。
真的很简单。
关于javascript - 正则表达式以匹配逗号分隔的主机名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28057243/