特殊字符导致Joi验证出现问题
P粉267791326
P粉267791326 2023-08-31 09:52:18
0
1
581
<p>我想限制文本框内的内容为250个字。我正在使用joi验证来实现。它应该计算所有字符(包括特殊字符)并且只允许250个字。但是我遇到了以下问题。</p> <ol> <li><p>一旦出现第一个特殊字符,即使是在3个字后面,我就会收到joi验证错误,显示“此部分不能超过250个字”。</p> </li> <li><p>当我从PDF中复制粘贴内容时,我的屏幕会冻结。所以我认为我的joi模式有问题。</p> </li> </ol> <pre class="brush:php;toolbar:false;">description1: Joi.string().regex(/^(([\w\s,."'()-]+)\b[\s,.]*){0,250}$/).options({ language: { string: { regex: { base: '此部分不能超过250个字' } } } }).label("此部分"),</pre> <p>有人能帮帮我吗?</p>
P粉267791326
P粉267791326

全部回复(1)
P粉916760429

这可能有效:

/^\s*(?:\S+\s+){0,249}\S*\s*$/

与你原来的正则表达式中仅匹配[a-zA-Z0-9_]\w不同,特殊符号\S匹配任何非空格字符。因为字符集\S\s完全不同,所以这应该避免了任何与灾难性回溯相关的问题。

解释:

  • \s* 开头的0个或多个空格。这些不计入。
  • (\S+\s+) 一个单词,由1个或多个非空格字符后跟1个或多个空格字符组成。
  • {0,249} 最多重复249次
  • \S* 可选地在结尾添加一个额外的单词,该单词不应以空格结尾。这是第250个单词,所以上面的行数需要是249而不是250。

这只能回溯最后一个单词的长度,所以如果最后一个单词非常长,可能会很慢。然而,增长不能是指数级的,所以它不应该导致Joi崩溃。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板