【问题标题】:php Pattern Matching for custom tags自定义标签的php模式匹配
【发布时间】:2012-03-25 17:30:20
【问题描述】:

我正在尝试将 {{name:something}} 等文件中的所有标签替换为某些特定值。 请注意,在{{name::something}} 中,只有某些东西可能会引起注意。喜欢{{name:title}}{{name:content}}。那个“名字”将永远存在。

无论如何, 我使用了 preg_match_all 和 preg_replace,一切都解决了。我找到了这个正则表达式的匹配项:$patmatch="/{{name:[a-zA-Z0-9._-]+}}/";

我的问题如下:

当这样的标签与模式不匹配时(它有语法错误),如{{notname:something}}{{name something}}{{ }} 我必须抛出异常。 我如何知道标签是否存在,但有语法错误?

我能否以某种方式进行另一个模式搜索来检查它是否是一个标签(在{{}} 之间)以及它是否不像{{name:something}}

任何帮助将不胜感激, 谢谢!

【问题讨论】:

    标签: php tags design-patterns match


    【解决方案1】:

    在我的头顶:

    if(strpos($text, '{{name:') === false)
    {
        //exception
    }
    else
    {
        //properly formatted text
    }
    

    类似的东西?

    【讨论】:

    • 嗯,差不多。你看, preg_match_all() 函数只会让我得到正确的匹配。格式正确的文本。但我还需要找到不正确的,如果发现任何异常则抛出异常。
    • 谢谢大家,我用NFLineast的ideea解决了这个问题。我只是 preg_match_all() 在每个 $patmatch="/{{[a-zA-Z0-9.:_-]+}}/"; (基本上每个 {{ }} )然后我只检查 if(strpos($text, '{{name:') === false) 就像NFLineast所说的那样。再次感谢,你所有的解决方案都很好,我想我也会尝试其他的:) Darksody。
    • 优秀。 strpos() 也比 preg_match() 消耗更少的资源... :)
    【解决方案2】:

    其他答案只检查该标签是否在内容内,这个检查真正的有效性:

    假设您有 $content 变量来保存文件的内容,您可以临时存储验证数据,如下所示:

    $validation = preg_replace("/{{name:[a-zA-Z0-9._-]+}}/","",$content);
    

    因此,您将删除有效标签,现在您要查找无效标签,具体取决于您想要的严格程度,您可以使用以下其中一种:

    if(preg_match('/{{name:[^}]*}}/', $validation)) //found error tag
    //alternatively you might want to check for typos like "nmae":
    if(preg_match('/{{[^}]*}}/', $validation)) //found error tag
    

    【讨论】:

      【解决方案3】:

      也许你可以使用子模式,命名并检查结果

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-04
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 2018-06-10
        • 1970-01-01
        相关资源
        最近更新 更多