【问题标题】:Splitting text in PHP在 PHP 中分割文本
【发布时间】:2009-06-20 11:08:52
【问题描述】:

我想知道有没有办法像这样分割文本:

123456789 转 123-456-789

至于每3个字符后加“-”?

只是想知道,因为我知道相反,但是如何做到这一点是我的头。 ;)

如果文本是

ABCDEFGHI OR A1B2C3D4E or any other format 
without any space between the characters !

语言:仅限 PHP

【问题讨论】:

  • 是的,这当然是可能的。不过,请给我们一个线索……您使用的是什么编程语言?
  • 这当然是可能的,但是如果您指出您正在使用的语言或平台,您会得到更好的响应。

标签: php regex text split


【解决方案1】:

<?php
$i = '123456789';
echo 'result: ', wordwrap($i, 3, '-', true);
打印
结果:1​​23-456-789

http://php.net/wordwrap

【讨论】:

    【解决方案2】:

    我不是简单字符串提取(尤其是固定长度提取)的正则表达式的忠实粉丝,更喜欢它们用于稍微复杂的东西。几乎每种语言都有一个子字符串函数,所以假设您的输入已经过验证,一个简单的(伪代码,因为您没有指定语言):

    s = substring (s,0,3) + "-" + substring (s,3,3) + "-" + substring (s,6,3)
    

    如果你想要一个可变长度的字符串每三个字符(最后是奇数):

    t = ""
    sep = ""
    while s != "":
        if s.len <= 3:
            t = t + sep + s
            s = ""
        else:
            t = t + sep + substring (s,0,3)
            s = substring (s,3)
        sep = "-"
    s = t
    

    【讨论】:

    • 但是 ABCDEFGHI 或 A1B2C3D4E 呢
    • 怎么样?如果规范是处理任何字符串,上面的代码将处理任何字符串。它不一定是数字。
    【解决方案3】:

    对于任何语言:

    • 创建一个名为“result”的空字符串变量
    • 创建一个整数计数器变量“i”,它会递增直到原始字符串的长度(带数字的那个)
    • 将原始字符串中的每个字符附加到“结果”
    • 如果 i 模 3(通常是 % 或 mod)为零,则在“结果”后添加一个破折号

    【讨论】:

      【解决方案4】:

      为了完整起见,这里有一个 Python 解决方案:

      >>> a = "123456789"
      >>> a[0:3] + "-" + a[3:6] + "-" + a[6:9]
      '123-456-789'
      

      由于您更新了问题以指定 PHP 解决方案,这应该可以工作:

      substr($a, 0, 3) . "-" . substr($a, 3, 3) . "-" . substr($a, 6, 3)
      

      有关此功能的更多信息,请参阅substr。这不仅适用于数字,也适用于字母字符。

      【讨论】:

        【解决方案5】:

        又一个 Python 版本:

        >>> x="123456789"
        >>> out=[x[i:i+3] for i in xrange(0, len(x), 3)]
        >>> print "-".join(out)
        123-456-789
        

        【讨论】:

          【解决方案6】:

          我认为这可以在带有前瞻的正则表达式中完成:

          s/(.{3})(?=.)/$1-/g
          

          既然你在评论中提到了 PHP:

          preg_replace ("/(.{3})(?=.)/", "$1-", $string);
          

          编辑:VolkerK显示wordwrap后,我在文档中找到了chunk-split

          $new_string = chunk_split ($string, 3, '-');
          

          这有一个优点,当字符串中有空格时它也可以工作(自动换行更喜欢在空格处中断)。

          【讨论】:

          • 你对理智的定义与我的不一致:-)
          【解决方案7】:

          在 Perl 中:

          #!/usr/bin/perl
          
          use strict;
          use warnings;
          
          my $string = "123456789";
          $string =~ /(\d{3})(\d{3})(\d+)/;
          
          print "$1-$2-$3"
          

          【讨论】:

            【解决方案8】:

            您可以使用(除其他方法外)正则表达式匹配和替换来做到这一点。确切的语法取决于您使用的工具或编程语言。例如,在 Perl 中执行此操作的一种方法是

            $a = "123456789";
            $a =~ s/(\d{3})/$1-/g;
            chop($a);
            print $a;
            

            第 2 行将每 3 位数字替换为相同的 3 位数字和一个破折号。使用chop(),我们删除了尾随的破折号。

            这里还有一个问题。当字符串不包含 3 位数的倍数时该怎么办?如果允许这样的字符串,那么上面的 sn-p 就需要修改了。

            此外,根据案例的具体情况,您可能会通过简单的子字符串替换或字符串切片来摆脱困境。

            【讨论】:

            • 如果位数不是 3 的倍数,这似乎会砍掉一个数字。
            • 如果它的 ABCDEFGHI 或 A1B2C3D4E 那么如何分割文本和仅在 php 中
            • 嘿,不,我似乎停在了排骨上。
            【解决方案9】:

            还有一个 Perl 示例。这不会删除小于 3 的最终组,只会留下小于 3 位数的初始组。它基于(非常无耻地)Learning Perl(第 5 版第 212 页)中的“货币数字”示例:

            #!/usr/bin/env perl
            use strict;
            use warnings;
            
            print "Gimme' a number: ";
            chomp(my $number = <STDIN>);
            
            1 while ($number =~ s/([0-9]{3})([0-9]+)/$1-$2/);
            
            print "Now it's $number\n";
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-11-09
              • 2013-06-16
              相关资源
              最近更新 更多