替换str_replace中的整数

内森·金(Nathan King)

我有一个包含数字的字符串,我需要对字符串中的每个数字进行颜色编码。

我的preg_match_all给了我一个包含正确数字(5,280,51)的数组。我需要将第一个数字涂成红色,第二个涂成蓝色,第三个涂成黑色。

当前,第三个数字(51)无法正确着色。5被涂成红色,然后1被忽略。我需要将整个数字(51)涂成黑色。

我相信我的代码先匹配5个,然后匹配280个,然后再匹配下一个5个,而不考虑以下1个。我该如何解决这个问题?

$coloursArray = array('red', 'blue', 'black');
$string = "dbase 5% used - 280G free | audit 51% used";

preg_match_all('#\d+(?:\.\d{1,2})?#', $string, $matches);
for ($k = 0; $k < count($matches[0]); $k++)
{
    $string = str_replace($matches[0][$k], '<strong><span style="color: '.$coloursArray[$k].';">' . $matches[0][$k] . '</span></strong>', $string);
}

输出:

dbase <strong><span style="color: red">5</span></strong>% used
- <strong><span style="color: blue">280</span></strong>G free
| audit <strong><span style="color: red">5</span></strong>1% used

最后一行应该是:

| audit <strong><span style="color: black">51</span></strong>% used
汤姆·费内奇

的第一个调用str_replace是替换5字符串中的两个。这意味着第三个调用不执行任何操作。

由于数组$matches包含要替换的数字,因此可以这样使用preg_replace

$coloursArray = array('red', 'blue', 'black');
$string = "dbase 5% used - 280G free | audit 51% used";

preg_match_all('#\d+(?:\.\d{1,2})?#', $string, $matches);

for ($k = 0; $k < count($matches[0]); $k++)
{
    $string = preg_replace("/(\D){$matches[0][$k]}(\D)/", '$1<strong><span style="color: '.$coloursArray[$k].';">' . $matches[0][$k] . '</span></strong>$2', $string);
}

echo $string;

在这里,我捕捉到的非数字字符使用每个号码前,后(\D)和他们加入到使用替换字符串$1$2

输出:

dbase <strong><span style="color: red;">5</span></strong>% used - <strong><span style="color: blue;">280</span></strong>G free | audit <strong><span style="color: black;">51</span></strong>% used

另外,您可以使用preg_replace_callback以下命令一次性完成全部操作

$coloursArray = array('red', 'blue', 'black');
$string = "dbase 5% used - 280G free | audit 51% used";

$c = 0;
$string = preg_replace_callback('#\d+(?:\.\d{1,2})?#', function($x) use (&$c, $coloursArray) { 
    return '<strong><span style="color: '.$coloursArray[$c++].';">' . $x . '</span></strong>'; 
}, $string);

每个匹配项都传递给回调函数,并执行替换操作,$c++每次使用都会从数组中选择一个不同的索引。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章