正则表达式替换为由函数修改的反向引用

时间:2010-02-19 18:34:54

标签: php regex replace preg-replace

我想用div文本替换类,如下所示:
这:<div class="grid-flags" >FOO</div>

成为:<div class="iconFoo" ></div>

所以课程改为“icon”。 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 个答案:

答案 0 :(得分:3)

我很难尝试找出你的意思,但我认为你想要这样的东西:

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

示例输入的输出:

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

如果这不是您想要的,请您给我们一些示例输入和输出?

我必须同意,使用HTML解析器会更容易。

答案 1 :(得分:2)

您可以使用preg_replace_callback(),而不是使用e(评估)选项。

$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

答案 2 :(得分: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 HTML with regex的问题。