首页 > 解决方案 > 不应连续使用特殊字符

问题描述

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

标签: javascriptregex

解决方案


您可以先使用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);
  }
})


推荐阅读