2010-02-19 75 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