2012-11-20 70 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