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

4
我希望将类(class)替换为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代码,但我不理解它在我的情况下如何工作,因为我需要双引号来包围类名,所以我不知道该怎么做。
我尝试了反向引用的变化,例如strtolower('$1')、strtolower('\1')和strtolower('{$1}')等。
我已经尝试了单引号和双引号以及各种转义等方法,但仍然没有成功。
我甚至尝试了preg_replace_callback(),但也没有成功。
function callback($matches){
    return 'class="icon"'.ucfirst(strtolower($matches[0])).'"';
}
3个回答

3

我知道你想要什么,但是理解起来有点困难。我认为你需要类似于这样的东西:

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

您的示例输入的输出结果:

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

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

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


感谢大家在周末给出的答案。这是我最初尝试的方法,也是最简洁的方式,因此我将其作为了采纳的答案,但你们提出了很多好的观点。 - Jesse

2

你可以使用preg_replace_callback()函数来替代使用e(valuate)选项。

$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扩展


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
);

要注意使用正则表达式解析HTML时可能会遇到的问题(parsing HTML) (with regex)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接