php 中 preg_replace 的问题 - 转换 html 中的特定代码

Problem with preg_replace in php - Transform specific codes in html

我正在尝试改造这个:

§f§lWORDHERE

在此:

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

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

<?php

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

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

$str = "§f§lWORDHERE";

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

echo $str_res;

?>

想法是:

§F => white
§L => bold

提前致谢

您的正则表达式只匹配前缀,不匹配其后的单词。您需要一个词的捕获组。

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

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

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

$str = '§f§lWORDHERE';

$replacements = [
  '§f' => '<span style="color: white;">[=10=]</span>',
  '§l' => '<b>[=10=]</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;
}

Demo

注:

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

可以替换为:

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

如果您使用的是 PHP < 7.4.