我想用preg_replace()
;在一组数字之间添加空格
$numbers = '90000800123987';
期望的输出:900 00 800 123 987
在这一点上我很困惑,到目前为止我无法获得所需的输出。
我想用preg_replace()
;在一组数字之间添加空格
$numbers = '90000800123987';
期望的输出:900 00 800 123 987
在这一点上我很困惑,到目前为止我无法获得所需的输出。
对于您的具体示例,可以这样做:
$numbers = '90000800123987';
$regex = '/(\\d{3})(\\d{2})(\\d{3})(\\d{3})(\\d{3})/';
$result = preg_replace($regex, '$1 $2 $3 $4 $5', $numbers);
这将起作用,但可以改进。
preg_replace(
'/^([0-9]{3})([0-9]{2})([0-9]{3})([0-9]{3})([0-9]{3})$/',
'$1 $2 $3 $4 $5',
$numbers
);
关于@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 位数字之后找到零宽度位置,然后在这些位置添加一个空格。
\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
)
);