如何使用PHP将字符串拆分为非固定长度的块?

时间:2014-12-17 23:31:33

标签: php

结束目标:将数据库中的数字块(例如0000000和22222以及333333333333)更改为不同的长度。例如,可能包含国家代码前缀的电话号码(例如+00(000)000-0000,或2,3,3,4的模式),因此可以根据不同的情况更改长度的选项电话号码格式会很好。

我喜欢使用explode或chunk_split来实现简单性的想法,因为我将处理大量数据并且我不希望它过多地耗尽服务器:

$string = "1111111111";     
$new_nums = chunk_split($string, 3, " ");
echo $new_nums;

^这里唯一的问题是我只能使用一位数字。

最好的方法是什么?我应该创建一个函数吗?

2 个答案:

答案 0 :(得分:1)

使用正则表达式?

$regex = "/(\\d{2})(\\d{3})(\\d{3})(\\d{4})/"; 
$number = "111111111111"; 
$replacement = "+$1 ($2) $3-$4"; 

$result = preg_replace($regex, $replacement, $number);

https://regex101.com/r/gS1uC1/1

答案 1 :(得分:1)

虽然你在你的例子中提到了一个电话号码,但听起来你想要的东西可以做更多,同时也允许指定多个和可变的块长度。一种方法是创建一个函数来获取数据,分隔符/分隔符以及许多块值。

您可以使用func_num_args()func_get_args()来计算您的块长度。

以下是此类功能的示例:

<?php

function chunkData($data, $separator)
{
    $rebuilt = "";
    $num = func_num_args();
    $args = func_get_args();
    if($num > 2)
    {
        for($i = 2; $i < $num; $i++)
        {
            if(strlen($data) > 0)
            {
                $string = substr($data, 0, $args[$i]);
                $segment = strpos($data, $string);
                if($segment !== false)
                {                   
                    $rebuilt .= $string . $separator;
                    $data = substr_replace($data, "", 0, $args[$i]);
                }
            }
        }
    }
    $rebuilt .= $data;
    $rebuilt = rtrim($rebuilt, $separator);
    return $rebuilt;
}

//Usage examples:

printf("Phone number: %s \n", chunkData("2835552093", "-", 3, 3, 4));
printf("Groups of three letters: %s \n", chunkData("ABCDEFGHI", " ", 3, 3, 3));
printf("King Roland's passcode: %s \n", chunkData("12345", ",", 1, 1, 1, 1, 1));
printf("Append leftovers: %s \n", chunkData("BlahBlahBlahJustPlainBlah", " ", 4, 4, 4));
printf("Doesn't do much: %s \n", chunkData("huh?", "-"));

?>

//Output:

Phone number: 283-555-2093
Groups of three letters: ABC DEF GHI 
King Roland's passcode: 1,2,3,4,5 
Append leftovers: Blah Blah Blah JustPlainBlah 
Doesn't do much: huh?