代码之家  ›  专栏  ›  技术社区  ›  Severin

php preg\u replace,将所有span标记替换为span标记的数据属性

  •  0
  • Severin  · 技术社区  · 7 年前

    例子: 给定字符串:

    $str = 'text <span data-snippet-php ="do magic">Hello World</span> text';
    

    $str = 'text do magic text';
    

    用数据段php值替换span标记。

    到目前为止,这在示例中仍然有效: https://regex101.com/r/XhaEA9/1/ 但是,它只能与一个span标记一起正常工作。第一场和第二场比赛之间的一切都将被吞没。 正确的模式是什么?

    $re = '/<span.*?data-snippet-php="(.*?)".*?>.*?<\/span>/m';
    $str = 'HTML Code <span class="block" title="Label: Titel" data-snippet-php="<?php _e(\'Titel\',\'grid_test\') ?>" editable="false">[ Titel ]</span>: <span class="block" title="Datenfeld: Titel" data-snippet-bind="#: post_title #" editable="false">{ post_title }</span> text text text <span class="block" title="Label: Desc" data-snippet-php="<?php _e(\'Desc\',\'grid_test\') ?>" editable="false">[ Desc ]</span>: text text text';
    $subst = '$1';
    $result = preg_replace($re, $subst, $str);
    $result ==> 
    'HTML Code <?php _e('Titel','grid_test') ?>: <?php _e('Desc','grid_test') ?>: text text text';
    

    这个结果是错误的,我想要这个结果:

    $result ==> 
    'HTML Code <?php _e('Titel','grid_test') ?>: <span class="block" title="Datenfeld: Titel" data-snippet-bind="#: post_title #" editable="false">{ post_title }</span> text text text <?php _e('Desc','grid_test') ?>: text text text';
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Toto    7 年前

    在你的正则表达式里 .*? 是不够的,它匹配到 data-snippet-php="(.*?)" 以下内容之一 <span ,你必须在第一次遇到前停止搜索 >

    $str = <<<EOD
    HTML Code <span class="block" title="Label: Titel" data-snippet-php="<?php _e('Titel','grid_test') ?>" editable="false">[ Titel ]</span>: 
    <span class="block" title="Datenfeld: Titel" data-snippet-bind="#: post_title #" editable="false">{ post_title }</span> 
    text text text 
    <span class="block" title="Label: Desc" data-snippet-php="<?php _e(\'Desc\',\'grid_test\') ?>" editable="false">[ Desc ]</span>: text text text
    EOD;
    
    $re = '~<span[^>]*?data-snippet-php="([^"]*)"[^>]*>[^<]*</span>~sm';
    //           ^^^^^^                   ^^^^^  ^^^^^ ^^^^^        ^ I've added s flag to deal with multilines
    $subst = '$1';
    $result = preg_replace($re, $subst, $str);
    echo $result,"\n";
    

    输出:

    HTML Code <?php _e('Titel','grid_test') ?>: 
    <span class="block" title="Datenfeld: Titel" data-snippet-bind="#: post_title #" editable="false">{ post_title }</span> 
    text text text 
    <?php _e(\'Desc\',\'grid_test\') ?>: text text text
    
    推荐文章