REGEX解析模板回显

时间:2012-11-20 13:10:08

标签: php regex

我正在尝试使用正则表达式解析一些输入。输入格式为:

{someValue中:3}

目的是显示'som'(没有引号)。

目前,我有:

 'echo' => array(
            'search' => '~\{((?:'.$this->preg['var'].')(?:\.)?)\}~sU',
            'replace' => "'.\$this->_get('\\1').'"
        )

这对我的模板系统非常有用,可以回显标准变量(即'somevalue')。但是,我希望允许用户使用:分隔符来限制输出的字符数(即{somevalue:3}将显示'som')。

我试过了:

'echo' => array(
            'search' => '~\{((?:'.$this->preg['var'].')(?:\.)?:(.*)/)\}~sU',
            'replace' => "'.substr(\$this->_get('\\1'),0,\\2).'"
        )

但是这没用。我真的不懂正则表达式,所以任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:0)

看起来你在新的搜索表达式中有一个额外的'/'。

                                                       |
                                                       v
'search' => '~\{((?:'.$this->preg['var'].')(?:\.)?:(.*)/)\}~sU',

我不熟悉您正在使用的模板系统,但似乎还需要更改替换表达式。

'replace' => "'.substr(\$this->_get('\\1'),0,\$this->_get('\\2')).'"

将这些放在一起,您可以尝试这样的尝试:

'echo' => array(
            'search' => '~\{((?:'.$this->preg['var'].')(?:\.)?:(.*))\}~sU',
            'replace' => "'.substr(\$this->_get('\\1'),0,\$this->_get('\\2')).'"
        )

应该注意的是,如果这样做,旧的输入方式将不再起作用。换句话说,您始终必须使用格式{<string>:<num_of_chars>},而不仅仅是{<string>}

答案 1 :(得分:0)

$s = preg_replace_callback(
       '/\{([^:]+):(\d+)\}/',
       create_function('$m', 'return substr($m[1], 0, $m[2]);'), $s);

测试此代码 here