You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript验证Smarty代码?解决邮箱验证与Smarty标签冲突问题

问题解决思路与代码调整

嘿,我来帮你搞定这个问题!你的核心需求是让输入框同时支持合法邮箱和带闭合标签的Smarty代码,还不能修改邮箱的验证规则对吧?现在的问题出在Smarty验证正则写得不够完善,导致带斜杠的闭合标签(比如{/foreach})没法被识别,进而触发邮箱验证被拦截。咱们只需要调整Smarty的验证规则和验证顺序就能解决。

第一步:修复Smarty验证正则

你原来的Smarty正则不仅有语法错误,还只能匹配{{...}}这种双大括号标签,完全覆盖不了单大括号的闭合标签。我调整后的正则能匹配所有常见的Smarty标签格式:

smarty: function(v) {
  // 匹配双大括号{{...}},以及单大括号的标签/闭合标签(比如{foreach}、{/foreach})
  const regex = /\{\{[\s\S]*?\}\}|\{\/?[a-zA-Z0-9_\-]+(?:\s+.*?)?\}/g;
  return regex.test(v);
},

这个正则能识别:

  • 双大括号包裹的变量或逻辑标签:{{$user.mail}}、{{foreach from=$list item='item'}}
  • 单大括号的闭合标签:{/foreach}
  • 带属性的单大括号标签:{assign var='username' value='test'}

第二步:调整验证逻辑顺序

原来的验证顺序是先判断Smarty再判断邮箱,咱们反过来更合理:先验证是否是合法邮箱,如果是直接通过;如果不是,再验证是否是Smarty代码。这样能彻底避免邮箱规则干扰Smarty的验证:

emailOrSmarty: function(v) {
  // 先检查是否是合法邮箱,通过直接返回true
  if (this.email(v)) {
    return true;
  }
  // 邮箱不通过,再验证是否是合法Smarty代码
  return this.smarty(v);
},

第三步:保留原邮箱验证规则

你的邮箱正则是符合标准格式的,而且本身就允许斜杠(看正则里的\/),完全不用修改,直接保留就行:

email: function(v) {
  const regex = /^(?:[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~_.\-+])+@(?:(?:[a-zA-Z0-9\-])+?\.)+(?:[a-zA-Z0-9]{2,})+$/;
  return regex.test(v);
},

验证测试

现在用你的示例测试完全没问题:

  • 示例1(邮箱):example@website.com → 邮箱验证通过,返回true
  • 示例2(Smarty代码):{{foreach from=$find.users|filter:"male":$city' item='user'}}{{$user.mail}}{{/foreach}} → 邮箱验证不通过,Smarty验证通过,返回true

这样既保留了邮箱的验证规则,又能完美支持带斜杠的Smarty闭合标签啦!

内容的提问来源于stack exchange,提问作者Izzy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:58:50