2012-11-20 73 views
0

我想解析一些使用正则表达式的输入。输入将在格式:REGEX解析模板回声

{someValue中:3}

目的是显示 'SOM'(无quotemarks)。

目前,我有:

'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

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

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

+0

我明白你的意思是关于原来的{string}不再工作。为了解决这个问题,我改变了它,这是数组中一个名为'echolimit'的新元素,所以现有的标签不受影响。我试过你的代码,但没有奏效。我将它改为:''echolimit'=> array( 'search'=>'〜\ {((?:'。$ this-> preg ['var']。')(?:\。)? :(。*))\}〜sU', 'replace'=>“'.substr(\ $ this - > _ get('\\ 1'),0,'\\ 2')。'” \t \t \t),'但现在它不显示任何东西(其他现有{标签}仍然完美)。 – Amo

+0

substr应该将第一个参数作为字符串,第二个作为偏移量,第三个作为长度。您的版本具有使用$ this - > _ get('\\ 2')的第三个参数 - 但是$ this - > _ get()是一个函数,用于从要显示的模板中查找标记变量。在这种情况下,它应该具有的是在{stringtodisplay:limit}标记之后传递的数字 – Amo

+0

由于我对您使用的模板引擎了解不多,因此我认为'$ this-> _get('\\ 1')'意味着从$ this-> preg()调用中获得第一个捕获组。由于我们添加了第二个捕获组来获取数字,因此我假设$ this - > _ get('\\ 2')会执行此操作。我知道我的代码嵌套捕获组,这是没有必要的。你可以试试这个吗? ''echolimit'=> array('search'=>'〜\ {((?:'。$ this-> preg ['var']。')(?:\。)?):([0-9 ] +)\}〜sU','replace'=>“'.substr(\ $ this - > _ get('\\ 1'),0,\ $ this - > _ get('\\ 2'))。'')' –

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

测试此代码here

+0

这里的代码不适合现有的模板解析器,这就是问题所在,尽管它显示'som',但我需要的代码与上面提供的代码相同,不幸的是,重写整个分析算法会花费太多时间和冗余。你的代码与我提供的风格相同? – Amo