【问题标题】:Regex Replace with Backreference modified by functions正则表达式替换为函数修改的反向引用
【发布时间】:2011-01-18 21:55:32
【问题描述】:

我想用这样的 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])).'"';
}

【问题讨论】:

    标签: php regex replace preg-replace


    【解决方案1】:

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

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

    示例输入的输出:

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

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

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

    【讨论】:

    • 感谢大家周末的回答。这是我尝试做的最原始的方式,也是最简洁的,所以我把这个作为公认的答案,但是你们都提出了很好的观点。
    【解决方案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,而不是使用正则表达式。

    【讨论】:

      【解决方案3】:

      这对我有用

      $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的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-25
        • 2017-01-30
        • 1970-01-01
        • 1970-01-01
        • 2014-06-01
        • 1970-01-01
        相关资源
        最近更新 更多