替换除4位数之外的所有数字

时间:2014-04-29 15:21:13

标签: php regex

我正在努力学习正则表达式,让我解释一下......

我有一个使用PHP的文本,我希望将所有数字转换为'###',除了那些长度为4位的数字。例如:

“在20世纪80年代,有402人在火灾中丧生。那里有42345名消防员。费用估计为423,232.32美元”

需要成为:

“在20世纪80年代,###人在火中死亡。那里有###消防员。费用估计为$ ###,###。###”

所以我希望每个不是年数的数字,即没有4位数。理想情况下,我想在1900年到2100年之间只有几年,但它的复杂程度就像我想的那样......

这个:/([\d]{1,3})|([\d]{5,})/不起作用,因为它认为1980年是198然后是0 ......

非常感谢:)

3 个答案:

答案 0 :(得分:4)

如何使用preg_replace_callback

$s = "In the 1980s, 402 people died in a fire. There were 42345 firemen there. The cost were estimated at $423,232.32";

$replaced = preg_replace_callback('/\d+/', function($match) {
    $n = strlen($match[0]);
    if ($n == 4)
        return $match[0];
    return str_repeat('#', $n);
    // return '###';
}, $s);
// => "In the 1980s, ### people died in a fire. There were ##### firemen there. The cost were estimated at $###,###.##"

答案 1 :(得分:2)

可能是一个更好的正则表达式,但使用\b(字边界)修复你的我认为:

echo preg_replace('/(\b\d{1,3}\b)|(\d{5,})/', '###', $string);

您也不需要角色类[ ]

答案 2 :(得分:0)

使用preg_replace的另一种方法:

$pattern = '~(?:(?!\A)\G|(?<!\d)(?=\d{1,3}+(?>\d{2,})?(?!\d)))\d~';
$txt = preg_replace($pattern, 'x', $txt);