首页 > 解决方案 > php中preg_replace的问题-在html中转换特定代码

问题描述

我正在尝试改变它:

§f§lWORDHERE

在这:

<span style="color: white;><b>WORDHERE</b></span>

我以为有了这个我会实现它,但显然它不是这样的:

<?php

$colorcodes = array(
    '/§f/',
    '/§l/'
);

$replacement = array(
    '<span style="color: white;">$0</span>',
    '<b>$0</b>',
);

$str = "§f§lWORDHERE";

$str_res = preg_replace($colorcodes, $replacement, $str);

echo $str_res;

?>

这个想法是:

§F => white
§L => bold

提前致谢

标签: phppreg-replace

解决方案


我会先抓住标志,然后替换它们:

$str = '§f§lWORDHERE';

$replacements = [
  '§f' => '<span style="color: white;">$0</span>',
  '§l' => '<b>$0</b>',
];

if (preg_match('/^(?<flags>(?:§[a-z])+)(?<string>.*)/iu', $str, $matches)) {
    $str_res = $matches['string'];

    foreach (mb_str_split($matches['flags'], 2) as $flag) {
        $str_res = preg_replace('/.+/', $replacements[$flag], $str_res);
    }

    echo $str_res;
}

演示

笔记:

mb_str_split($matches['flags'], 2) 

可以替换为:

str_split($matches['flags'], 3)

如果您使用的是 PHP < 7.4。


推荐阅读