替换str_replace中的整个数字

时间:2015-03-18 10:37:23

标签: php regex str-replace preg-match-all

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

我的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

2 个答案:

答案 0 :(得分:0)

使用此基于外观的正则表达式来避免匹配不需要的文本:

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

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

<强>输出:

  

base <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

答案 1 :(得分:0)

第一次调用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++每次从数组中选择不同的索引。