用php格式化数据

用php格式化数据,php,formatting,variables,string-formatting,Php,Formatting,Variables,String Formatting,我需要能够在变量中格式化数据,如下所示: format: xxx-xxx variable: 123456 output: 123-456 问题是我需要能够更改格式,这样静态解决方案就不起作用了。我还希望能够更改变量大小,如: format: xxx-xxx variable: 1234 output: 1-234 注:所有变量均为数字 编辑我应该很清楚它的格式,它不一定总是3人一组,它可能会有更多的“-”作为一个符号,组将是不稳定的1-22-333-4444它将只在1-5人一组中你的最佳选

我需要能够在变量中格式化数据,如下所示:

format: xxx-xxx variable: 123456 output: 123-456
问题是我需要能够更改格式,这样静态解决方案就不起作用了。我还希望能够更改变量大小,如:

format: xxx-xxx variable: 1234 output: 1-234
注:所有变量均为数字

编辑我应该很清楚它的格式,它不一定总是3人一组,它可能会有更多的“-”作为一个符号,组将是不稳定的1-22-333-4444它将只在1-5人一组中

你的最佳选择是

正则表达式需要一些时间来适应,但这可能是您最好的选择

编辑:

关键是使每个集合(最右边的集合除外)都不贪婪,从而允许面向右侧的模式匹配。

您可以实现and,并拥有新的格式类,这些类可以在运行时交换。如果您以前没有见过它,它看起来很复杂,但它确实有助于提高可维护性,并允许您随时使用setFormatter()切换格式化程序

class StyleOne_Formatter implements Formatter
{
    public function format($text)
    {
      return substr($text,0,3).'-'.substr($text,3);
    }
}

class StyleTwo_Formatter implements Formatter
{
    public function format($text)
    {
      return substr($text,0,1).'-'.substr($text,1);
    }
}
然后您将拥有如下格式设置类:

class NumberFormatter implements Formatter
{

   protected $_formatter = null;

   public function setFormatter(Formatter $formatter)
   {
      $this->_formatter = $formatter;
   }

   public function format($text)
   {
     return $this->_formatter->format($text);
   }
}
然后你可以这样使用它:

 $text = "12345678910";
 $formatter = new NumberFormatter();

 $formatter->setFormatter(new StyleOne_Formatter());
 print $formatter->format($text);
 // Outputs 123-45678910

 $formatter->setFormatter(new StyleTwo_Formatter());
 print $formatter->format($text);
 // Outputs 1-2345678910

如果要格式化的输入始终是整数,则可以尝试数字\格式和货币格式(千等) 下面是一个解决方案,它接受任何字符串并将其转换为所需的格式:

$split_position = 3;
$my_string      = '';
echo strrev(implode('-',(str_split(strrev($my_string),$split_position))));

input: 1234;     output: 1-234
input: abcdefab; output: ab-cde-fab
input: 1234567   output: 1-234-567

有没有办法在不知道位置的情况下设定模式?@scott,不知道你的意思?您可以在不使用结束字符串标记的情况下进行模式匹配。。。我建议读一些关于正则表达式使用的书…读你的更新。。。您可以将his封装到一个函数中,在该函数中传入模式、格式和输入字符串,并返回结果…我以前尝试过这种类型的方法,但每个块需要多个组,我使用的是php5。我不明白你说的每个块一组是什么意思。格式化程序可以从preg_替换返回结果,如Tracker1的解决方案,但可以有多个不同的格式化程序。你的脚本输出123-45678910,但我需要能够输出更多的组,如12-345-67-8910,然后你可以修改算法在生成它的过程中,我演示了一种可以轻松更改算法的方法。由你决定你的算法做什么。对于这种格式,您需要substr($input,0,2)。'-'.substr($input,2,3)。'-'.substr($input,5,2)。'-'.substr($input,7);但是有更好的方法来生成这个输出(preg_replace)。如果它可以有一个以上的组大小,这将非常有效。将下面的示例更新为4个部分。。。
$split_position = 3;
$my_string      = '';
echo strrev(implode('-',(str_split(strrev($my_string),$split_position))));

input: 1234;     output: 1-234
input: abcdefab; output: ab-cde-fab
input: 1234567   output: 1-234-567