【问题标题】:Regex - Validate Closing tag - Template Engine正则表达式 - 验证结束标签 - 模板引擎
【发布时间】:2019-09-30 09:40:48
【问题描述】:

对于特定的模板引擎,用户将在其中添加/更新模板以向客户发送消息。

我正在使用正则表达式来验证每个具有双标签的模板文字,一个字符串中的起始 << 和结束 >> 标签。

Given 是有效的模板引擎。

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 模板字面量
&lt;&lt;cName&gt;&gt;
&lt;&lt;totAmt&gt;&gt;
&lt;&lt;accNum&gt;&gt;
&lt;&lt;agentName&gt;&gt;
&lt;&lt;payLink&gt;&gt;

给出 invalid 模板字面量
&lt;&lt;cName&gt;
&lt;&lt;agentName&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;
&lt;cName&gt;
&lt;&lt;&lt;&lt;&lt;payLink&gt;&gt;
&lt;&lt;cName&lt;&lt;&gt;&gt;

目前给是我的解决方法。

首先,我使用给定的正则表达式获取所有模板文字。

<.>(?!>)

然后循环遍历每个文字以在 PHP 中使用给定的正则表达式进行验证。如果任何文字无效,则用户更新的给定模板无效。

^]+>{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
        }
    }
}

我们可以在单个正则表达式或任何更好的解决方案(在 JS / PHP 中)中找到无效的模板文字。

提前致谢

【问题讨论】:

  • 你是用 JS 还是 PHP 验证?
  • 您的意思是要提取所有无效的文字吗?与预期结果共享一些示例字符串。
  • @WiktorStribiżew,我添加了有效和无效的文字模式。
  • @CodeManiac,目前是 php,但 JS 中的解决方案将有利于未来的前端验证。
  • @Anon30 ^(&lt;&lt;(?&gt;[^&lt;&gt;\n]+|(?1))&gt;&gt;)$ 这就是你想要的吗?

标签: javascript php regex string


【解决方案1】:

要验证标签,你可以试试这个模式

(?<!<)<<[^<>]+>>(?!>)
  • (?&lt;!&lt;) - 匹配前不应有 &lt;
  • &lt;&lt; - 匹配 &lt;&lt;
  • [^&lt;&gt;]+ - 匹配除 &lt;&gt; 之外的任何内容
  • &gt;&gt; - 匹配 &gt;&gt;
  • (?!&gt;) - 匹配后不应跟随 &gt;

Regex Demo

【讨论】:

  • 这和我的解决方案一样。我需要查找任何给定模板中是否有任何文字无效。
  • @Anon30 您已经捕获了所有标签,对吧?您可以使用此正则表达式过滤不正确的标签
  • 是的,我现有的代码也是如此。但我需要更好更快的解决方案。
【解决方案2】:

使用动词(*SKIP)(*FAIL)

这将尝试匹配有效的标签然后失败或匹配所有具有&lt;+blah&gt;+ 形式的东西,实际上是无效的:

$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<<>>
        )

)

【讨论】:

    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    相关资源
    最近更新 更多