PHP:将字符串拆分为字母和数字组件的最佳方法

时间:2012-07-13 19:47:08

标签: php string

我有几个格式的字符串

AA11
AAAAAA1111111
AA1111111

分离字符串的字母和数字组件的最佳(最有效)方法是什么?

5 个答案:

答案 0 :(得分:5)

如果它们都是一系列alpha,后跟一系列数字,没有非alphameric字符,那么sscanf()可能比regexp更有效

$example = 'AAA11111';
list($alpha,$numeric) = sscanf($example, "%[A-Z]%d");

var_dump($alpha);
var_dump($numeric);

答案 1 :(得分:1)

preg_split应该做得很好。

preg_split('/(\w+)/', $input, -1, PREG_SPLIT_DELIM_CAPTURE);

preg库在处理字符串方面效率惊人,因此我认为它比使用更原始的字符串函数手动编写的任何内容都更有效。但要做一个测试,看看你自己。

答案 2 :(得分:1)

您可以直接添加一个额外的支票,而不是立即使用RegEx:

if (ctype_alpha($testcase)) {
   // Return the value it's only letters
} else if(ctype_digit($testcase)) {
   // Return the value it's only numbers
} else {
   //RegEx your string to split nums and alphas
}
编辑:很明显,我的回答没有给出表现更好的证据,这就是为什么我做了一个产生以下结果的测试:

  1. preg_split耗时5.3319189548492秒
  2. sscanf花了3.4432129859924秒
  3. 答案应该是sscanf

    以下是产生结果的代码:

    $string = "AAAAAAAAAA111111111111111";
    $count = 1000000;
    
    function prSplit($string) {
        return preg_split( '/([A-Za-z]+)/', $string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
    }
    
    function sScanfTest($string) {
        return sscanf($string, "%[A-Z]%[0-9]");
    }
    
    function microtime_float()
    {
        list($usec, $sec) = explode(" ", microtime());
        return ((float)$usec + (float)$sec);
    }
    
    $startTime1 = microtime_float();
    for($i=0; $i<$count; ++$i) {
        prSplit($string);
    }
    $time1 = microtime_float() - $startTime1;
    echo '1. preg_split took '.$time1.' seconds<br />';
    
    $startTime2 = microtime_float();
    for($i=0; $i<$count; ++$i) {
        sScanfTest($string);
    }
    $time2 = microtime_float() - $startTime2;
    echo '2. sscanf took '.$time2.' seconds';
    

答案 3 :(得分:1)

以下是使用preg_split()的工作示例:

$strs = array( 'AA11', 'AAAAAA1111111', 'AA1111111');

foreach( $strs as $str) 
    foreach( preg_split( '/([A-Za-z]+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $temp)
        var_dump( $temp);

outputs

string(2) "AA"
string(2) "11"
string(6) "AAAAAA"
string(7) "1111111"
string(2) "AA"
string(7) "1111111"

答案 4 :(得分:0)

这似乎可行,但是当您尝试传递“ 111111 ”之类的东西时,它却无效。

在我的应用程序中,我预计会有几种情况,并且似乎可以解决问题的方法是

library(data.table)
setDT(df)

df[, N := .N, B][order(-N)][, -'N']

#         A         B                  C
# 1:  Nr1h4 PTHR24082 ENSMUSG00000047638
# 2:   Rarg PTHR24082 ENSMUSG00000001288
# 3:    Vdr PTHR24082 ENSMUSG00000022479
# 4: Kif21a PTHR24115 ENSMUSG00000022629
# 5:  Acss3 PTHR24115 ENSMUSG00000035948
# 6:  Pamr1 PTHR24254 ENSMUSG00000027188

注意

  1. 获取由2个元素组成的数组,这意味着第0个索引是 alpha ,而第1个索引是数字
  2. 获取仅1个元素的数组,表示第0个元素是数字,没有字母。
  3. 如果您获得2个以上的数组项,则您的字符串必须采用“ AAA1323SDC”格式

因此,鉴于以上所述,您可以根据自己的用例进行操作。

干杯!