new RegExp(Reg).test(value)无效

目录

前沿

问题分析

[eval 函数](#eval 函数)

[# 定义和用法](# 定义和用法)

[# 语法](# 语法)

[# 浏览器支持](# 浏览器支持)

[# 实例](# 实例)

使用eval函数

优化

拓展


------ 要么旅行,要么读书,身体和灵魂必须有一个在路上。

前沿

之前写过一篇正则表达式的基础:http://t.csdnimg.cn/45Da3

今天继续讲讲在实际场景中的运用。

问题分析

当正则表达式来自服务端时,通过一下代码是无法进行test的

javascript 复制代码
const handleInput = (value, item) => {
  if (!value) return;
  const regex = new RegExp(item.reg);
  const result = regex.test(value);
  item.checked = result;
};

因为item.reg严格来说已经不是一个正则脚本,而是一个字符串

javascript 复制代码
# /^\d{15,17}$/ 是验证 手机机身码(IMEI) 的正则表达式

  console.log(typeof item.reg);
  --> string
  console.log(typeof /^\d{15,17}$/);
  --> object

经过校验,可以使用 JavaScript eval() 函数

eval 函数

# 定义和用法

eval() 函数计算 JavaScript 字符串,并把它作为脚本代码来执行。

如果参数是一个表达式,eval() 函数将执行表达式。如果参数是Javascript语句,eval()将执行 Javascript 语句。

# 语法

javascript 复制代码
eval(string)

|--------|--------------------------------------------|
| 参数 | 描述 |
| string | 必需。要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。 |

# 浏览器支持

# 实例

执行JavaScript代码或表达式:

javascript 复制代码
eval("x=10;y=20;document.write(x*y)");
document.write("<br>" + eval("2+2"));
document.write("<br>" + eval(x+17));

以上实例输出结果:

javascript 复制代码
200
4
27

使用eval函数

更新代码:

javascript 复制代码
const handleInput = (value, item) => {
  if (!value) return;
  const regex = new RegExp(eval(item.reg));
  const result = regex.test(value);
  item.checked = result;
};

校验

javascript 复制代码
const regex = new RegExp(eval(item.reg));
console.log(typeof regex);
--> object

说明经过eval处理过的字符串正则已经被编译成脚本来执行了。

你以为这样就完了?看看这段官方话

永远不要使用 eval!

eval() 是一个危险的函数,它使用与调用者相同的权限执行代码。如果你用 eval() 运行的字符串代码被恶意方(不怀好意的人)修改,你最终可能会在你的网页/扩展程序的权限下,在用户计算机上运行恶意代码。更重要的是,第三方代码可以看到某一个 eval() 被调用时的作用域,这也有可能导致一些不同方式的攻击。相似的 Function 就不容易被攻击。

优化

通过以上分析,无外乎就是需要将item.reg字符串转成函数(脚本)即可正常test。

那么,现在就来实现吧,先定义一个转换函数的函数looseJsonParse

javascript 复制代码
function looseJsonParse(obj) {
  return Function('"use strict";return (' + obj + ")")();
}

再优化我们原先的代码

javascript 复制代码
const handleInput = (value, item) => {
  if (!value) return;
  const regex = new RegExp(looseJsonParse(item.reg));
  console.log(typeof regex);
  const result = regex.test(value);
  item.checked = result;
};

这里可以看到他的输出:

javascript 复制代码
  const regex = new RegExp(looseJsonParse(item.reg));
  console.log(typeof regex);
  --> object

拓展

当然,如果你看过我之前分享的文章《常用正则表达式》: 常用正则表达式(含图解)_正则表达式图标-CSDN博客

里面的几种使用正则表达式的方法:

javascript 复制代码
# 创建正则表达式对象,使用RegExp构造函数
const regex = new RegExp(/^\d{15,17}$/);
const result = regex.test(regex);


# 使用String.prototype.match()方法匹配正则表达式
'string'.match(/^\d{15,17}$/);

同理,附上 match 的同等代码

javascript 复制代码
const handleInput = (value, item) => {
  if (!value) return;
  const result = value.match(looseJsonParse(item.reg));
  item.checked = result;
};

最后,无论你使用哪一种方法,只要安全、节省性能、代码精炼就是好方法,值得推荐给大家使用。如果你有更好的注意不妨分享出来给大家~

相关推荐
星栈7 小时前
pnpm 12 升级实测
前端·javascript
Ai-_Man8 小时前
您您这可以把Microsofat Copilot的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭
javascript·人工智能·ai·小程序·电脑·copilot
Bruce_Liuxiaowei11 小时前
网页版 DeepSeek “harness desktop“ WebGL 上下文创建失败排查实录
开发语言·javascript·webgl
小凯在掘金12 小时前
为什么箭头函数不能作为构造函数?
前端·javascript
可乐鸡翅yeah_12 小时前
网页端 M3U8 播放器性能监控,怎么看播放卡顿指标
javascript·ffmpeg·音视频·safari·m3u8
可乐鸡翅yeah_12 小时前
M3U8 防盗链 URL‑Token 签名,新手开发实操避坑
开发语言·javascript·ios·音视频·safari
2603_9658966212 小时前
JS原型与原型链|对象继承与实例底层原理
开发语言·javascript·原型模式
JustHappy13 小时前
「vConsole MCP🛠️」我让 AI 直接看见任何 H5 的日志和请求帮你 debug
前端·javascript·程序员
xieter14 小时前
【技术精选】Node.js 核心事件循环机制与异步 I/O 深度剖析 (2026-10-02)
前端·javascript
想吃火锅100515 小时前
【leetcode】238.除了自身以外数组的乘积js
javascript·算法·leetcode