如何使用JavaScript验证Smarty代码?

时间:2019-07-09 15:40:23

标签: javascript regex validation smarty

我需要验证可以包含智能代码或电子邮件的输入字段。我使用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}}

2 个答案:

答案 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中观察它如何与某些示例输入匹配如果愿意,可以逐步进行。