正则表达式没有获得所有匹配

时间:2012-01-16 19:31:32

标签: php regex

基本上我正在编写一个小模板解析器,它使用正则表达式来解析一些标签,目前我在同一个文件中匹配多个标签时遇到了麻烦。

这是我目前的正则表达式模式:

$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);
}
?>

非常感谢任何帮助。 干杯

2 个答案:

答案 0 :(得分:1)

你不应该使用正则表达式来创建这样的解析器。它只是not possible。无论如何,正如Francis所说,如果您从第一个if块中删除{$ name},它将使用您现有的代码进行匹配。

答案 1 :(得分:1)

正则表达式在处理匹配的嵌套闭包时很可悲。任何具有开始和结束结构的东西都是闭包,将它们塞进彼此之内或者在元级别上处理它们是非常困难的。

请参阅此帖子的最佳答案,更具体地说是(X)HTML RegEx match open tags except XHTML self-contained tags,然后考虑您基本上使用不同的大括号重新创建了类似XML的过程。

正则表达式用于“正则表达式”匹配。不幸的是,“常规”并不意味着它通常意味着什么,而是针对特定类型问题的数学标语。