2

我想用preg_replace();在一组数字之间添加空格

$numbers = '90000800123987';

期望的输出:900 00 800 123 987

在这一点上我很困惑,到目前为止我无法获得所需的输出。

4

3 回答 3

7

对于您的具体示例,可以这样做:

$numbers = '90000800123987';
$regex = '/(\\d{3})(\\d{2})(\\d{3})(\\d{3})(\\d{3})/';
$result = preg_replace($regex, '$1 $2 $3 $4 $5', $numbers);
于 2012-04-24T14:01:38.730 回答
0

这将起作用,但可以改进。

preg_replace(
    '/^([0-9]{3})([0-9]{2})([0-9]{3})([0-9]{3})([0-9]{3})$/',
    '$1 $2 $3 $4 $5',
    $numbers
);
于 2012-04-24T14:13:56.430 回答
0

关于@splash的回答,多余的反斜杠不是必须的,可以省略第一个和第五个捕获组(只需将中间三个转移到替换字符串,并且在开头和结尾写空格),所以答案可以归结为:

代码:(演示

var_export(
    preg_replace('/\d{3}\K(\d{2})(\d{3})(\d{3})/', ' $1 $2 $3 ', '90000800123987')
);
output: '900 00 800 123 987'

这匹配前 3 个字符,然后忘记它们,它们捕获接下来的 2 个字符 ( $1),然后是接下来的 3 个字符 ( $2),然后是接下来的 3 个字符 ( $3)。


作为学术放纵,也可以在替换字符串中没有任何捕获组或引用的情况下完成此任务。

在第 3、5、8 和 11 位数字之后找到零宽度位置,然后在这些位置添加一个空格。

  • 第 4 位和第 5 位数字后面是 9 位数字和字符串的结尾。
  • 其他目标 3 位字符串不在字符串末尾。
  • \K意味着忘记当前匹配的内容 - 因此在替换中实际上没有删除任何字符。

代码:(演示)(模式演示

var_export(
    preg_replace(
        '~(?|\d{2}(?=\d{9}$)|\d{3}(?!$))\K~',
        ' ',
        '90000800123987'
    )
);

输出:

'900 00 800 123 987'

其他工作模式包括:

  • ~(?|(?<=^\d{5})|\d{3}\K(?!$))~
    
  • ~(?|\d{2}(?<=^\d{5})|\d{3}(?!$))\K~
    
  • ~(?=(?>\d{11}|\d{9}|\d{6}|\d{3})$)~
    
  • ~(?<=^\d{3}|^\d{5}|^\d{8}|^\d{11})~
    

我发现非正则表达式技术不太有吸引力:

$s = '90000800123987';
var_export(
    "$s[0]$s[1]$s[2] $s[3]$s[4] $s[5]$s[6]$s[7] $s[8]$s[9]$s[10] $s[11]$s[12]$s[13]"
);

或者

$s = '90000800123987';
var_export(
    substr($s, 0, 3)
    . ' ' . substr($s, 3, 2)
    . ' '. substr($s, 5, 3)
    . ' '. substr($s, 8, 3)
    . ' '. substr($s, 11, 3)
);

或者

var_export(
    substr_replace(
        substr_replace(
            substr_replace(
                substr_replace(
                    '90000800123987',
                    ' ',
                    11,
                    0
                ),
                ' ',
                8,
                0
            ),
            ' ',
            5,
            0
        ),
        ' ',
        3,
        0
    )
);
于 2020-12-05T04:16:49.010 回答