【问题标题】:How to separate letters and digits from a string in php如何在php中从字符串中分离字母和数字
【发布时间】:2011-05-17 16:55:03
【问题描述】:

我有一个由字母和数字组合而成的字符串。对于我的应用程序,我必须用字母和数字分隔一个字符串:例如:如果我的字符串是“12jan”,我必须分别获得“12”“jan”..

【问题讨论】:

    标签: php string substring


    【解决方案1】:
    $string = "12312313sdfsdf24234";
    preg_match_all('/([0-9]+|[a-zA-Z]+)/',$string,$matches);
    print_r($matches);
    

    这可能会更好

    【讨论】:

    • 给出 Array ( [0] => Array ( ) [1] => Array ( ) [2] => Array ( ) )
    • 为什么要麻烦捕获分组?我可能会使用不区分大小写的标志。此答案缺少教育解释。
    【解决方案2】:
    preg_match_all('/^(\d+)(\w+)$/', $str, $matches);
    
    var_dump($matches);
    
    $day = $matches[1][0];
    $month = $matches[2][0];
    

    当然,这仅在您的字符串与描述的完全一致时才有效“abc123”(没有附加或附加空格)。

    如果您想获取所有数字和字符,可以使用一个正则表达式。

    preg_match_all('/(\d)|(\w)/', $str, $matches);
    
    $numbers = implode($matches[1]);
    $letters = implode($matches[2]);
    
    var_dump($numbers, $letters);
    

    See it!

    【讨论】:

    • 这假定字符串不会是 jan12 或 fg1dg34sdf。
    • preg_match_all('/(\d)|(.)|(\w)/', $str, $matches); 也会尊重像 '12-jan' 或 'jan-12' 这样的字符串,如果你也想重用提取的字符的话。
    • MrMacvos 的注释代码具有误导性/错误,但我不能 dv 它。 不要使用它。 3v4l.org/9tDfr3v4l.org/INJ1H
    【解决方案3】:
    $numbers = preg_replace('/[^0-9]/', '', $str);
    $letters = preg_replace('/[^a-zA-Z]/', '', $str);
    

    【讨论】:

    【解决方案4】:

    试试这个:

    $string="12jan";
    $chars = '';
    $nums = '';
    for ($index=0;$index<strlen($string);$index++) {
        if(isNumber($string[$index]))
            $nums .= $string[$index];
        else    
            $chars .= $string[$index];
    }
    echo "Chars: -$chars-<br>Nums: -$nums-";
    
    
    function isNumber($c) {
        return preg_match('/[0-9]/', $c);
    } 
    

    【讨论】:

    • 在某些版本中是 is_numeric()
    • 在自定义函数中为字符串中的每个字符调用 preg_match() —— 这对这项任务来说开销太大了。我不建议任何研究人员使用此选项。结果,我已经投票并投票删除了这个答案。
    【解决方案5】:

    您可以使用preg_split 将您的字符串拆分到前面是数字,后面是字母的位置:

    $arr = preg_split('/(?<=[0-9])(?=[a-z]+)/i',$str);
    

    Code in Action

    <?php
    $str = '12jan';
    $arr = preg_split('/(?<=[0-9])(?=[a-z]+)/i',$str);                                                               
    print_r($arr);
    

    结果:

    Array
    (
        [0] => 12
        [1] => jan
    )
    

    【讨论】:

    • 如果有空格,您的代码将不起作用。 $str = 12 Jan 那样
    • 如果有空格,用空格本身作为分隔符使用explode不是更容易吗?
    • @PrashantTapase 只是在字符集中添加空格 [a-z] : [\sa-z]
    • 此代码仅在数字在前时有效。如果您将 $str 更改为 'jan12' ,它将输出 [0] => 'jan12'
    【解决方案6】:

    这符合我的要求,您可以根据自己的要求进行编辑

    function stringSeperator($string,$type_return){
    
        $numbers =array();
        $alpha = array();
        $array = str_split($string);
        for($x = 0; $x< count($array); $x++){
            if(is_numeric($array[$x]))
                array_push($numbers,$array[$x]);
            else
                array_push($alpha,$array[$x]);
        }// end for         
    
        $alpha = implode($alpha);
        $numbers = implode($numbers);
    
        if($type_return == 'number')    
        return $numbers;
        elseif($type_return == 'alpha')
        return $alpha;
    
    }// end function
    

    【讨论】:

    • 这个答案缺少教育解释。如果要返回字符串,为什么不直接使用迭代字符串连接技术呢?使用临时数组和内爆似乎是不必要的浪费。
    【解决方案7】:

    您可以通过匹配数字或非数字序列来拆分字符串,然后用\K“忘记”匹配的字符。

    preg_split(
        '~(?:\d+|\D+)\K~',
        $string,
        0,
        PREG_SPLIT_NO_EMPTY
    )
    

    或者您可以使用匹配的数字作为分隔符并在输出中保留分隔符。

    preg_split(
        '~(\d+)~',
        $string,
        0,
        PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE 
    )
    

    两种技术的demonstration

    【讨论】:

    • 数字和字母交织在一起会产生很多组。
    • 当然会。有什么选择? minimal reproducible example 的范围如此狭窄,以至于如果输入被扩展,我无法猜测所需的输出应该有何不同。
    猜你喜欢
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 2013-02-13
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多