我想用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])).'"';
}
答案 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的问题。