javascript 特殊字符的Joi验证中断

mdfafbf1  于 2023-02-28  发布在  Java
关注(0)|答案(1)|浏览(145)

bounty将在10小时后过期。回答此问题可获得+50声望奖励。Arsene Wenger希望引起更多人对此问题的关注:想学习如何自定义Joi来检查字数小于等于250(包括特殊字符)。这里有一个很大的bug,因为当我把内容粘贴到输入框时,我的前端冻结了。

我想限制文本框内的内容为250个单词,我使用joi验证,它应该计算所有字符(包括特殊字符),并且只允许250个单词,但是我面临着以下问题。
1.第一个特殊字符出现的时刻,即使它是在3个单词之后,我可以得到joi验证错误说“这一节必须包含不超过250个单词”。
1.当我把PDF文件中的内容复制粘贴到其中时,我的屏幕冻结了,所以我认为我的joi模式出了问题。

description1: Joi.string().regex(/^(([\w\s,."'()-]+)\b[\s,.]*){0,250}$/).options({ language: { string: { regex: { base: 'This section must contain no more than 250 words' } } } }).label("this section"),

有人能帮帮我吗?

dddzy1tm

dddzy1tm1#

这可能行得通:

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

\w不同的是,在只匹配[a-zA-Z0-9_]的原始正则表达式中,特殊标记\S匹配任何非空白字符。由于字符集\S\s完全不同,因此这应该避免任何灾难性回溯问题。

解释:

  • \s*开头有0个或更多空格。这些空格根本不计算在内。
  • (\S+\s+)一个单词,由1个或多个非空白字符后跟1个或多个空白字符组成。
  • {0,249}最多重复249次
  • \S*可选地在末尾增加一个单词,不应该以空格结尾。这是第250个单词,这就是为什么上面的行需要是249而不是250。

这只能回溯到最后一个单词的长度,所以如果最后一个单词非常非常长的话会很慢。但是,增长不能是指数级的,所以不应该崩溃joi。

相关问题