如何用“ - ”字符拆分字符?

时间:2013-07-25 12:18:40

标签: php function split

我用php生成了一个序列号,这个序列号的长度是16个字符,我想用4个字符用破折号( - )分割这个序列号,就像这个格式xxxx-xxxx-xxxx-xxxx所以我写了这个PHP代码:

for ($d=0; $d<=3; $d++){
     $tmp .= ($tmp ? "-" : null).substr($serial,$d,4);
}

所以这个循环将返回一个xxxx-xxxx-xxxx-xxxx格式的序列号,

我想知道php中有没有更好的方法或功能?

我在互联网上搜索了sprintfnumber_format,但我不知道如何将此功能用于此格式!

4 个答案:

答案 0 :(得分:7)

我会使用str_split()implode()

$result = implode( '-', str_split( $serial, 4));

str_split()会将字符串分解为数组,其中每个元素都有4个字符。然后,implode()用短划线连接这些数组。

因此,如果我们使用:

生成随机$serial
$serial = substr(md5(uniqid(rand(), true)), 0, 16);

我们会得到类似于as output的内容:

59e6-997f-8446-80a2 

答案 1 :(得分:4)

试试这个:

$str   = "xxxxxxxxxxxxxxxx";
echo substr(chunk_split($str, 4, '-'), 0, -1); 

输出:

xxxx-xxxx-xxxx-xxxx

参考:http://www.php.net/manual/en/function.chunk-split.php

答案 2 :(得分:1)

str_split,相当清楚......

$hyphenated = implode( '-', str_split( $str, 4));

这很清楚,但生成一个数组只是为了破坏它似乎有点浪费。所以我想知道是否有另一种方式...

使用preg_replace更快?

我尝试了一个正则表达式,认为这将消除对中间数组的需求。毕竟,为什么有一个问题,当你可以two

$hyphenated = preg_replace('/(.{4})(?=.)/', '$1-', $str);

那个小小的野兽会寻找4个字符,只要它们后面跟着至少一个字符,就会在它们之后插入一个斜线。

麻烦的是,结果慢了大约25%:(

chunk_split更快,具有相同的薄荷味道!

Prasanth Bendra发布了一个非常有效的答案,不需要中间数组

$hyphenated=substr(chunk_split($str, 4, '-'), 0, -1); 

结果!这比使用16字符输入字符串测量的str_split快至少25%,并且与str_split方法一样清晰。

答案 3 :(得分:0)

您可以使用str_split()尝试implode(),例如:

$tmpArray = str_split($tmp, 4);
$serialNumber = implode('-', $tmpArray);