Как проверить смарт-код с помощью JavaScript? - PullRequest
0 голосов
/ 09 июля 2019

Мне нужно проверить поле ввода, которое может содержать умный код или электронную почту.Я делаю это с RegExp, вы можете увидеть код ниже.Проблема заключается в том, что проверка электронной почты удаляет все косые черты, а закрывающие теги умного тега ({/ 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 ]

1 голос
/ 09 июля 2019

Ваш текущий шаблон соответствует тегам 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);
},

Чтобы проверить последний шаблон smarty с {{$user.mail}}, вы можете добавить:

smartyMailPattern: function(v) {
    var pattern = /{{foreach[^{}]+}}{{\$user\.mail}}{{\/foreach}}/;
    return pattern.test(v);
}
0 голосов
/ 09 июля 2019

Это немного сложно;предполагая, что ваше выражение проверки электронной почты может работать нормально, мы просто добавим часть foreach и проверим, может ли оно работать:

\{\{(.*?)\}\}\s*((?:[A-Za-z0-9!#$%&'*+\/=?^_`{|}~.+-])+@(?:(?:[A-Za-z0-9-])+?\.)+(?:[A-Za-z0-9]{2,})+)\s*\{\{\/(\1)\}\}

const regex = /\{\{(.*?)\}\}\s*((?:[A-Za-z0-9!#$%&'*+\/=?^_`{|}~.+-])+@(?:(?:[A-Za-z0-9-])+?\.)+(?:[A-Za-z0-9]{2,})+)\s*\{\{\/(\1)\}\}/sg;
const str = `{{foreach}} mail-1@mail.com  {{/foreach}}
{{foreach}} mail-2@mail.com{{/foreach}}
{{foreach}} 
	mail-3@mail.com
{{/foreach}}
					`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Выражение объяснено на верхней правой панели этой демонстрации , если вы хотите исследовать дальше или изменить / упростить ее, и в по этой ссылке , если хотите, вы можете посмотреть, как она будет шаг за шагом сопоставляться с некоторыми примерами входных данных.

...