我需要验证可以包含智能代码或电子邮件的输入字段。我使用RegExp执行此操作,您可以看到以下代码。问题在于,电子邮件验证会删除所有斜杠,而smarty标签({/ foreach})的结束标签包含斜杠。如何解决这个问题而不将所有斜线验证全部删除?
smarty: function(v) {
var regex = new RegExp("\\{\\{[^\\{^\\}]+\\}\\}", "g");
return regex.test(v);
},
emailOrSmarty: function(v) {
if (this.smarty(v) !== true) {
return this.email(v);
}
return true;
},
email: function(v) {
var regex = new RegExp('^(?:[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~_.\\-+])+@(?:(?:[a-zA-Z0-9\-])+?\.)+(?:[a-zA-Z0-9]{2,})+$');
return regex.test(v);
},
对有效输入进行采样
Example 1 (email):
example@website.com
Example 2 (smarty code):
{{foreach from=$find.users|filter:"male":$city' item='user'}}{{$user.mail}}{{/foreach}}
答案 0 :(得分:1)
您当前与smarty标签匹配的模式与开幕和结束标签匹配。不确定是否有意。
如果要验证在smarty标记之间是否只有一个电子邮件地址,可以通过匹配输入字符串上的smarty模式来重用smarty模式,然后替换为空字符串。那将留下电子邮件地址。
然后,您可以使用电子邮件验证来验证电子邮件。
请注意,如果您没有转义所有{}
。您的代码可能类似于:
emailOrSmarty: function(v) {
var smartyPattern = /{{[^{}]+}}/g;
return this.smarty(v) || this.email(v.replace(smartyPattern, ""))
}
我再次添加了相同的模式,但是您可以将其移动到另一个位置以重新使用它。
如果要测试其中任何一个,则已经具有2个验证功能。对于您的函数,如果其中一个为true
emailOrSmarty: function (v) {
return this.smarty(v) || this.email(v);
},
要使用{{$user.mail}}
测试最后一个聪明的模式,您可以添加:
smartyMailPattern: function(v) {
var pattern = /{{foreach[^{}]+}}{{\$user\.mail}}{{\/foreach}}/;
return pattern.test(v);
}
答案 1 :(得分:-1)
这有点复杂;假设您的电子邮件验证表达式可以正常工作,我们只需添加if(!empty($_POST)) {
$output = '';
$email = $_POST["email"];
$nama = $_POST["nama"];
$j_kel = $_POST["j_kel"];
$alamat = $_POST["alamat"];
$telepon = $_POST["telepon"];
$asalSekolah = $_POST["asalSekolah"];
$paketArray = implode(',',$_POST['paket']);
$sql = $koneksi->query("INSERT INTO `peserta` (`id`, `email`, `nama`, `j_kel`, `alamat`, `no_hp`, `asal_sekolah`, `paket`) VALUES (NULL, '$email', '$nama', '$j_kel', '$alamat', '$telepon', '$asalSekolah', '$paketArray');");
if($sql) {
$output .= '<label class="text-success">Pendaftaran Berhasil</label>';
} else {
$output .= '<label class="text-success">Pendaftaran Gagal</label>';
}
}
部分,然后检查它是否可以工作:
foreach
\{\{(.*?)\}\}\s*((?:[A-Za-z0-9!#$%&'*+\/=?^_`{|}~.+-])+@(?:(?:[A-Za-z0-9-])+?\.)+(?:[A-Za-z0-9]{2,})+)\s*\{\{\/(\1)\}\}
该表达式在this demo的右上角进行了说明,如果您想进一步探索或修改/简化它,可以在this link中观察它如何与某些示例输入匹配如果愿意,可以逐步进行。