我有这段代码,但似乎有问题,我无法让它工作。有趣的是,如果我将
/§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
$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);
?>
您必须使用数组
preg_replace
来替换多个值。所以,尽量用array_keys
代替key
;并删除array_shift
:
echo preg_replace(array_keys($color_code), $color_code, $text);
要扩展当前脚本的功能而不仅仅是影响第一个数组项,请将替换代码包装在循环中并不断更新文本。 演示
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
);