我正在尝试使用正则表达式解析一些输入。输入格式为:
{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).'"
)
但是这没用。我真的不懂正则表达式,所以任何帮助都会非常感激。
答案 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 。