如何定义regex(preg_replace)来删除数字字符之间的空格

时间:2012-09-10 04:14:34

标签: php regex string preg-replace space

我有这样的字符串:

$str = "old iccid : 809831 3245 345 new iccid : 999000 112221"

如何定义正则表达式以删除PHP中数字字符之间的空格字符,以成为此输出?

$output = "old iccid : 8098313245345 new iccid : 999000112221";

我尝试使用这种语法:

$output = preg_replace( '/\d[ *]\d/', '', $str);

但效果不佳。

3 个答案:

答案 0 :(得分:1)

尝试:

$output = preg_replace('/(?<=\d)\s+(?=\d)/', '', $str);

答案 1 :(得分:0)

regex引擎可以更快地遍历字符串/步数更少,而不会后退。

171步:(Demo

/(?<=\d)\s+(?=\d)/

115个步骤(Demo

/\d\K\s+(?=\d)/

您看到,在使用环视时,正则表达式引擎必须在每次出现空格时使用1或2种方式。

通过检查数字后跟空格,正则表达式引擎仅在找到合格的两个字符序列后才需要向前看。

在许多情况下,环顾四周和捕获组会花费额外的“步骤”,因此我更愿意寻找更有效的替代模式。

仅供参考,\K“重新开始完整的字符串匹配”。换句话说,它匹配后会忘记所有字符,直到元字符的位置为止。

p.s。您还可以使用/\d\K\s+(\d)/将步骤降到106 Demo,但随后需要引用捕获组,而我个人的喜好是避免在替换中使用该语法。

答案 2 :(得分:0)

尝试:

$input = "old iccid : 809831 3245 345 new iccid : 999000 112221"
$output = preg_replace("/(\d)\s+(\d)/", "$1$2", $input);
echo $input . "\n" . $output; //old iccid : 8098313245345 new iccid : 999000112221