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;
}
注:
mb_str_split($matches['flags'], 2)
可以替换为:
str_split($matches['flags'], 3)
如果您使用的是 PHP < 7.4.
我正在尝试改造这个:
§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;
}
注:
mb_str_split($matches['flags'], 2)
可以替换为:
str_split($matches['flags'], 3)
如果您使用的是 PHP < 7.4.