不应连续使用特殊字符



我正在为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);
}
})

最新更新