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

Php 正则表达式替换为由函数修改的反向引用,php,regex,replace,preg-replace,Php,Regex,Replace,Preg Replace,我想用div文本替换该类,如下所示: 此:FOO 变成: 因此,该类被更改为“icon”。ucfirst(strtolower(FOO))并删除文本 测试HTML <div class="grid-flags" >FOO</div> 替换 'class="icon'.ucfirst(strtolower($1).'"' 这是一个替换字符串的例子,我已经尝试了数百个。我读到/e修饰符对PHP代码求值,但我不明白它在我的例子中是如何工作的,因为我需要在类名周围加上双引号,

我想用div文本替换该类,如下所示:
此:
FOO

变成:

因此,该类被更改为“icon”。ucfirst(strtolower(FOO))并删除文本

测试HTML

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

'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])).'"';
}
您可以不使用e(估价)选项

$text='FOO';
$pattern='/class=“网格标志”>(FOO | BAR | BAZ)/;
$myCB=函数($cap){
返回'class=“icon”.ucfirst($cap[1])。“>”;
};
echo preg_replace_回调($pattern,$myCB,$text);
<>但不要使用正则表达式,您可能需要考虑一个更适合HTML或PHP的解析器。

< P>这对我来说是适用的。
$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
);
$html='FOO';
回显preg_replace_回调(
“/class*=*\”网格标志“*\>(FOO | BAR | BAZ)/”
,创建函数('$matches','return'class=“icon\”.ucfirst(strtolower($matches[1])。\'“>\'。$matches[1];'))
,$html
);

请注意的问题。

我很难理解你的意思,但我想你想要这样的东西:

preg_replace('/class="grid-flags" \>(FOO|BAR|BAZ)/e',
             '\'class="icon\'.ucfirst(strtolower("$1")).\'">\'',
             $text);
示例输入的输出:

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

如果这不是你想要的,你能给我们一些输入和输出的例子吗


我必须同意,使用HTML解析器会更容易做到这一点。

感谢大家周末的回答。这是我最初尝试的方式,也是最简洁的,所以我提出了一个公认的答案,但你们都提出了很好的观点。
preg_replace('/class="grid-flags" \>(FOO|BAR|BAZ)/e',
             '\'class="icon\'.ucfirst(strtolower("$1")).\'">\'',
             $text);
<div class="iconFoo"></div>