Regex - Проверить закрывающий тег - Template Engine - PullRequest
0 голосов
/ 30 сентября 2019

Для определенного механизма шаблонов, где пользователь будет добавлять / обновлять шаблоны для отправки сообщений клиентам.

Я использую регулярные выражения для проверки каждого литерала шаблона, имеющего двойные теги, начальный << и закрывающий тег >> в строке.

Дан действительный шаблонизатор.

Hi <<cName>>, please make your payment of $ <<totAmt>>   
for Account number <<accNum>> given by <<agentName>> at this link <<payLink>>
The validity of this link is 30 minutes.  

Даны valid литералов шаблона
<<cName>>
<<totAmt>>
<<accNum>>
<<agentName>>
<<payLink>>

Дано invalid литералов шаблона
<<cName>
<<agentName>>>>>>>>
<cName>
<<<<<payLink>>
<<cName<<>>

В настоящее время мой обходной путь - дать.

Сначала я получаю все литералы шаблонов, используя данное регулярное выражение.

<. *?> (?!>)

Затем выполните цикл по всем литералам для проверки с использованием заданного Regex в PHP. Если какой-либо литерал недопустим, значит, данный шаблон, обновленный пользователем, недействителен.

^ <{2} [^ <>] +> {2} (?!>)

$is_tpl_valid = true; //template is valid

$template = 'Hi <<cName>>, please make your payment of $ <<totAmt>>   
for Account number <<accNum>> given by <agentName>> at this link <<payLink>>
The validity of this link is 30 minutes.';

echo '<br/> --- File: ' . __FILE__ . '#'. __LINE__ . '------- $template -> ' . $template . ' --------------<br/>';
if(preg_match_all('#<.*?>(?!>)#', $template, $matched))
{
    echo '<pre>';
    print_r($matched);
    foreach($matched[0] as $item)
    {
        if($is_tpl_valid && !preg_match('#^<{2}[^<>]+>{2}(?!>)#', $item))
        {
            echo '<br/> --- File: ' . __FILE__ . '#'. __LINE__ . '------- $item -> ' .  $item . ' --------------<br/>';
            $is_tpl_valid = false; //template is invalid
        }
    }
}

Можем ли мы сделать это в одном Regex или в другом лучшем решении (в JS / PHP), чтобы найти недопустимые литералы шаблона.

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 30 сентября 2019

Для проверки тегов вы можете попробовать этот шаблон

(?<!<)<<[^<>]+>>(?!>)
  • (?<!<) - совпадению не должно предшествовать <
  • << - совпадение <<
  • [^<>]+ - Совпадение с чем угодно, кроме <>
  • >> - Совпадение >>
  • (?!>) - Совпадение не должно сопровождаться >

Regex Demo

1 голос
/ 30 сентября 2019

Используйте глаголы (*SKIP)(*FAIL).

Это попытается сопоставить действительные теги, а затем ОТКАЗАТЬ или сопоставить все с формой <+blah>+, которые фактически недопустимы:

$text = '
<<cName>>
<<totAmt>>
<<accNum>>
<<agentName>>
<<payLink>>

<<cName>
<<agentName>>>>>>>>
<cName>
<<<<<payLink>>
<<cName<<>> 
';

preg_match_all('/(?<!<)<<\w+>>(?!>)(*SKIP)(*FAIL)|<+[\w<]+>+/', $text, $m);
print_r($m);

Выход:

Array
(
    [0] => Array
        (
            [0] => <<cName>
            [1] => <<agentName>>>>>>>>
            [2] => <cName>
            [3] => <<<<<payLink>>
            [4] => <<cName<<>>
        )

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...