基本上我正在编写一个小模板解析器,它使用正则表达式来解析一些标签,目前我在同一个文件中匹配多个标签时遇到了麻烦。
这是我目前的正则表达式模式:
$regex = '#\{if \$([A-Za-z0-9_]+)\}([^{]+)(\{else\})?([^{]+)?\{\/if\}#'
我在这里错过了什么吗?
这是我正在尝试解析的模板文件的示例
{if $name}
Hi my name is: {$name}.
{else}
No name set.
{/if}
{if $male}
Gender: Male.
{else}
Gender: Female.
{/if}
这是我目前的PHP代码:
<?php
$tpl_file = file_get_contents('template.tpl');
$regex = '#\{if \$([A-Za-z0-9_]+)\}([^{]+)(\{else\})?([^{]+)?\{\/if\}#';
if (preg_match_all($regex, $tpl_file, $matches)) {
print_r($matches);
}
?>
非常感谢任何帮助。 干杯
答案 0 :(得分:1)
你不应该使用正则表达式来创建这样的解析器。它只是not possible。无论如何,正如Francis所说,如果您从第一个if
块中删除{$ name},它将使用您现有的代码进行匹配。
答案 1 :(得分:1)
正则表达式在处理匹配的嵌套闭包时很可悲。任何具有开始和结束结构的东西都是闭包,将它们塞进彼此之内或者在元级别上处理它们是非常困难的。
请参阅此帖子的最佳答案,更具体地说是(X)HTML RegEx match open tags except XHTML self-contained tags,然后考虑您基本上使用不同的大括号重新创建了类似XML的过程。
正则表达式用于“正则表达式”匹配。不幸的是,“常规”并不意味着它通常意味着什么,而是针对特定类型问题的数学标语。