我正在努力学习正则表达式,让我解释一下......
我有一个使用PHP的文本,我希望将所有数字转换为'###',除了那些长度为4位的数字。例如:
“在20世纪80年代,有402人在火灾中丧生。那里有42345名消防员。费用估计为423,232.32美元”
需要成为:
“在20世纪80年代,###人在火中死亡。那里有###消防员。费用估计为$ ###,###。###”
所以我希望每个不是年数的数字,即没有4位数。理想情况下,我想在1900年到2100年之间只有几年,但它的复杂程度就像我想的那样......
这个:/([\d]{1,3})|([\d]{5,})/
不起作用,因为它认为1980年是198然后是0 ......
非常感谢:)
答案 0 :(得分:4)
$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);