如何用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
相关产品推荐
相关产品推荐

