如何调整 preg_replace() 以尊重查找替换对关联数组中的所有项目

问题描述 投票:0回答:3

我有这段代码,但似乎有问题,我无法让它工作。有趣的是,如果我将

/§0([^§]*)/
替换为
/§2([^§]*)/
/§1([^§]*)/
,则选择的 id 有效,但其余的无效。

<?php
$text = "§6Title §f- §1Bla§2Bli§4Blu";
$color_code = array(
'/§0([^§]*)/' => '<span style="color: #000;">' . strtoupper("$1") . '</span>',
'/§1([^§]*)/' => '<span style="color: #0000AA;">' . strtoupper("$1") . '</span>',
'/§2([^§]*)/' => '<span style="color: #00AA00;">' . strtoupper("$1") . '</span>',
'/§3([^§]*)/' => '<span style="color: green;">' . strtoupper("$1") . '</span>',
'/§4([^§]*)/' => '<span style="color: green;">' . strtoupper("$1") . '</span>',
'/§5([^§]*)/' => '<span style="color: green;">' . strtoupper("$1") . '</span>',
'/§6([^§]*)/' => '<span style="color: green;">' . strtoupper("$1") . '</span>',
'/§7([^§]*)/' => '<span style="color: green;">' . strtoupper("$1") . '</span>',
'/§8([^§]*)/' => '<span style="color: green;">' . strtoupper("$1") . '</span>',
'/§9([^§]*)/' => '<span style="color: green;">' . strtoupper("$1") . '</span>',
'/§a([^§]*)/' => '<span style="color: green;">' . strtoupper("$1") . '</span>',
'/§b([^§]*)/' => '<span style="color: green;">' . strtoupper("$1") . '</span>',
'/§c([^§]*)/' => '<span style="color: green;">' . strtoupper("$1") . '</span>',
'/§d([^§]*)/' => '<span style="color: blue;">' . strtoupper("$1") . '</span>',
'/§e([^§]*)/' => '<span style="color: blue;">' . strtoupper("$1") . '</span>',
'/§f([^§]*)/' => '<span style="color: blue;">' . strtoupper("$1") . '</span>');

//echo preg_replace($suchmuster, $ersetzung, $zeichenkette);
echo $text;
echo '<br />';
echo preg_replace(key($color_code), array_shift($color_code), $text);
?>
php regex arrays preg-replace
3个回答
1
投票

这就是我将如何进行:

<?php
$text = "§6Title §f- §1Bla§2Bli§4Blu";

$color_code = array('#000', '#0000AA', '#00AA00', 'green', 'green', 'green',
                    'green', 'green', 'green', 'green',
                    'a'=>'green', 'b'=>'green', 'c'=>'green', 'd'=>'blue',
                    'e'=>'blue', 'f'=>'blue');
$pattern = '~§([0-9a-f])([^§]*)~';
$replacement = function ($match) use ($color_code) {
    return '<span style="color: ' . $color_code[$match[1]] . '">'
         . strtoupper($match[2]) . '</span>';
};
$result = preg_replace_callback($pattern, $replacement, $text);
print_r($result);
?>

0
投票

您必须使用数组

preg_replace
来替换多个值。所以,尽量用
array_keys
代替
key
;并删除
array_shift

echo preg_replace(array_keys($color_code), $color_code, $text);

0
投票

要扩展当前脚本的功能而不仅仅是影响第一个数组项,请将替换代码包装在循环中并不断更新文本。 演示

while ($color_code) {
   $text = preg_replace(key($color_code), array_shift($color_code), $text);
}
echo $text;

为了避免循环并避免消耗查找和替换规则的数组,请将所有键和所有值作为单个

preg_replace()
调用的第一个和第二个参数传递。 演示

echo preg_replace(
         array_keys($color_code),
         $color_code,
         $text
     );

最优雅的是,放弃规则数组并遵循 @Casimir 给出的建议,将

preg_replace_callback()
与合并模式和动态替换一起使用。 演示

echo preg_replace_callback(
         '/§([[:xdigit:]])([^§]*)/',
         fn($m) => sprintf(
             '<span style="color: %s">%s</span>',
             match($m[1]) {
                 '0' => '#000',
                 '1' => '#0000AA',
                 '2' => '#00AA00',
                 'd', 'e', 'f' => 'blue',
                 default => 'green'
             },
             strtoupper($m[2])
         ),
         $text
     );
© www.soinside.com 2019 - 2024. All rights reserved.