【问题标题】:How to split a string into chunks of non-fixed lengths using php?如何使用php将字符串拆分为非固定长度的块?
【发布时间】:2015-02-16 15:51:29
【问题描述】:

最终目标:将数据库中的数字块(如 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;

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

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

【问题讨论】:

  • 简短回答:正则表达式
  • 您可以在此 SOF 问题stackoverflow.com/questions/4708248/…中查看有关如何使用正则表达式解析/格式化电话号码的示例
  • 正则表达式可以创造奇迹。非常感谢,@Dagon !! :)
  • 谢谢你,@nunofmendes! :)

标签: php


【解决方案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? 

【讨论】:

  • 哇,这非常有用。您使用的 chunk_data 绝对给了我想要的东西。我非常感谢您提供给我的大量动态选项,而且它们似乎都工作得很好,而不会使服务器超载。非常感谢! :)
  • 没问题,很高兴它有帮助!出于性能目的,我将正则表达式排除在外。
  • @Crackertastic 有什么性能目的?正则表达式在性能方面要快得多...3v4l.org/ZLfQj/perf#output3v4l.org/lZtjq/perf#output
  • @Petah 老实说,我没有很好的答案。显然,当我在六年半前写那条评论时,我对正则表达式和性能的假设是错误的。 耸耸肩。感谢您的性能比较 - 他们很有见地!
  • @Crackertastic 都很好,我只看了这个,因为有人也撞了我 6 岁的答案。但对于任何未来的路人来说,值得注意的是正则表达式实际上可以非常高效。
【解决方案2】:

使用正则表达式?

$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

【讨论】:

  • 啊,是的,正则表达式。一个好朋友。我肯定也会使用它。非常感谢! :)
  • 对于任何想知道的人,如果您需要字母数字字符而不是数字,请在 $regex 上使用 w 而不是 d
猜你喜欢
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多