PHP - 使用正则表达式解析模板变量

时间:2010-09-05 13:37:09

标签: php regex return preg-match

我必须解析这个模板文件($ html):

{$myFirstVariable}
{$myMainVar:MYF1,"x\:x\,x",2:MYF2:MYF3,false}
{$myLastVariable:trim}

以下,我的php解析器:

$regexp = '#{\$(?<name>.+?)(\:(?<modifiers>.+?))?}#';

preg_replace_callback($regexp, 'separateVariable', $html);

function separateVariable($matches) {
    $varname = $matches['name'];

    print $varname."\n";

    if (isset($matches['modifiers'])) {
        $modifiers = $matches['modifiers'];

        $modifiers = preg_split('#(?<!\\\):#', $modifiers);
        $parsed = array();

        foreach ($modifiers as $modifier) {
            $modifier = preg_split('#(?<!\\\),#', $modifier);
            $parsed[array_shift($modifier)] = $modifier;
        }

        // parsed[myFuncName] = Array(2ndArg, 3rdArg)

        print_r($parsed);
    }

    print "\n";
}

所有工作除了我要在{$ myMainVar:...}中使用'\'来逃避':'和','。

你有什么解决办法可以让我免于'\'吗?

感谢。

3 个答案:

答案 0 :(得分:0)

Regex对此不会帮助太多,因为数据有多个级别。可能更容易先将数据拆分为:,然后解析结果(即现在将substr,1,2拆分为,)。问题是你需要多个Regex。正则表达式不返回数组,它们不进行多维匹配;它们用于从格式已知的数据中解析字段。

答案 1 :(得分:0)

正则表达式不能返回嵌套数组,此外,您尝试的内容似乎更多的是文本处理(substrexplode ..)而不是必须使用正则表达式。此外,您的示例并未明确输入的标准处理是如何工作的。

我建议:构建一个处理unserialiing进程逻辑的递归函数,该函数将使用switch case和string manipulation functions

答案 2 :(得分:0)

如果它可以帮到你:

$string = '{$myVariable:trim:substr,1,2}';

if (preg_match("#^\{\\$([a-zA-Z]+)\:([a-z]+)\:([a-z]+)\,([0-9]+)\,([0-9]+)\}$#", $string, $m)){
$result = <<<RESULT
Array (
    "{$m[1]}",
    Array (
        "{$m[2]}" => Array(),
        "{$m[3]}" => Array(
            {$m[4]},
            {$m[5]}
        )
    )
)
RESULT;
}
echo $result;