2010-02-19 37 views
4

我想通過這樣的DIV文本替換類修改:
此:<div class="grid-flags" >FOO</div>用正則表達式替換後向引用通過功能

變爲:<div class="iconFoo" ></div>

因此類變更爲「圖標」。 ucfirst(用strtolower(FOO))和文本被去除

測試HTML

<div class="grid-flags" >FOO</div> 

模式

'/class=\"grid-flags\" \>(FOO|BAR|BAZ)/e' 

代用

'class="icon'.ucfirst(strtolower($1).'"' 

這是一個替換字符串的一個例子我已經嘗試過數百個表面。我讀過/ e修飾符評估PHP代碼,但我不明白它是如何工作的,因爲我需要圍繞類名稱的雙引號,所以我迷失方向去做這件事。

我嘗試了變化的backref例如。 strtolower('1'),strtolower('\ 1'),strtolower('{$ 1}')

我試過單引號和雙引號以及各種轉義等,沒有任何工作。

我甚至嘗試preg_replace_callback(),沒有運氣

function callback($matches){ 
    return 'class="icon"'.ucfirst(strtolower($matches[0])).'"'; 
} 

回答

3

這是我很難試圖找出你的意思,但我想你想是這樣的:

preg_replace('/class="grid-flags" \>(FOO|BAR|BAZ)/e', 
      '\'class="icon\'.ucfirst(strtolower("$1")).\'">\'', 
      $text); 

輸出作爲例如輸入:

<div class="iconFoo"></div> 

如果ISN你想要什麼,你能給我們一些例子的輸入和輸出嗎?

而且我不得不承認,使用HTML解析器會更容易。

+0

謝謝大家週末的答案。這是我嘗試做的最簡單的方法,也是最簡潔的方式,所以我將其作爲公認的答案,但你們都提出了很多要點。 – Jesse 2010-02-22 15:06:04

2

而不是使用您可以使用preg_replace_callback()電子(計價)選項。

$text = '<div class="grid-flags" >FOO</div>'; 
$pattern = '/class="grid-flags" >(FOO|BAR|BAZ)/'; 
$myCB = function($cap) { 
    return 'class="icon'.ucfirst($cap[1]).'" >'; 
}; 
echo preg_replace_callback($pattern, $myCB, $text); 

但不是使用正則表達式,你可能要考慮的HTML更合適解析器像simple_html_dom或PHP的 DOM extension

+0

好的建議。謝謝! – Jesse 2010-02-22 15:15:15

0

這對我的作品

$html = '<div class="grid-flags" >FOO</div>'; 

echo preg_replace_callback(
    '/class *= *\"grid-flags\" *\>(FOO|BAR|BAZ)/' 
    , create_function('$matches', 'return \'class="icon\' . ucfirst(strtolower($matches[1])) .\'">\'.$matches[1];') 
    , $html 
); 

要知道的parsing HTMLwith regex的問題。

+0

我現在知道,我感謝你... – Jesse 2010-02-22 15:13:27