0

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

{一些值: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).'"
        )

但这没有用。老实说,我不太了解正则表达式,因此我们将不胜感激。

4

2 回答 2

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>}.

于 2012-11-20T13:24:44.560 回答
0
$s = preg_replace_callback(
       '/\{([^:]+):(\d+)\}/',
       create_function('$m', 'return substr($m[1], 0, $m[2]);'), $s);

在此处测试此代码。

于 2012-11-20T13:35:37.407 回答