javascript - 不应连续使用特殊字符
问题描述
我正在为 URL 验证创建正则表达式。不知何故,我已经根据需要验证了 Url,但我的要求是在域名https://asasas.com/
特殊字符之后不允许持续存在。想知道如何限制吗?
我的正则表达式
第 1 部分: (https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})
第 2 部分: [/]+[a-zA-Z0-9~@#$
!^%*;'&()<>_+=[]{}|\,.?: -]+.(?:jpg$|gif$|png$|jpeg$ )/`
第 1 部分正则表达式验证 URL,第 2 部分正则表达式验证应以 .JPG 或 .PNG 或 .JPEG 或 .GIF 结尾的字符串
我的要求是它不应该允许吗?
1) https://ssas.com//////////////////////sds.png
2) https://ssas.com/sds/ /@# $%/j^&&*///.png
成功案例:
每个特殊字符都应该有单词或数字
1) https://ssas.com/sds/sdsd/s#df ^ggasa/dadsa.png
解决方案
您可以先使用URL验证 url,而不是使用正则表达式验证整个 url 。
然后,您可以检查协议是否以 http 开头,并使用模式来检查源之后的字符串是否以允许的扩展名之一结尾,并且该字符串不包含您认为特殊的连续字符。
如果您想获得不区分大小写的匹配,您可以使用该/i
标志。
该模式由 2 个断言(非消耗性)组成
^(?=.*\.(?:jpe?g|png|gif)$)(?!.*[/~@#$!^%*;'&()<>_+=\[\]{}|\,.?:-][/~@#$!^%*;'&()<>_+=\[\]{}|\,.?:-])
在零件
^
字符串的开始(?=
正向前瞻,断言右边是.*\.(?:jpe?g|png|gif)$
$
匹配字符串末尾列出的任何内容
)
关闭前瞻(?!
负前瞻,断言右边的不是.*
匹配除换行符以外的任何字符 0+ 次[/~@#$!^%*;'&()<>_+=\[\]{}|\,.?:-]
匹配任何列出的[/~@#$!^%*;'&()<>_+=\[\]{}|\,.?:-]
和上面一样
)
关闭前瞻
[
"https://ssas.com//////////////////////////sds.png",
"https://ssas.com/sds//@#$%/j^&&*///.png",
"https://ssas.com/sds/sdsd/s#df^ggasa/dadsa.png"
].forEach(s => {
let url = new URL(s);
let secondPart = url.href.replace(url.origin, '');
let pattern = /^(?=.*\.(?:jpe?g|png|gif)$)(?!.*[/~@#$!^%*;'&()<>_+=\[\]{}|,.?:-][/~@#$!^%*;'&()<>_+=\[\]{}|,.?:-])/i;
if (
url.protocol.startsWith("http") &&
pattern.test(secondPart)) {
console.log(s);
}
})