2012-07-13 132 views

回答

4

如果他们都是一个系列的α,随之而来的一系列数字的,没有非字母数字字符,然后sscanf()可能比正则表达式

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

var_dump($alpha); 
var_dump($numeric); 
+0

它看起来像'sscanf()'[只是更快一点](http://viper-7.com/svMSAI)比'preg_split()'。但是,差异可能可以忽略不计。 – nickb 2012-07-13 20:07:00

+0

有一点需要注意,不要使用'%[AZ]%d',因为如果数字部分大于2147483647,结果会得到2147483647,例如:111111111111111您可以使用'%[AZ]%[0- 9]' – infinity 2012-07-13 20:29:59

1

preg_split应该做的工作罚款更有效。

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

预浸库在处理字符串出奇的高效率,所以我会假设它是比任何你可以手工编写,使用更原始的字符串函数更有效率。但做一个测试,并为自己看。

+0

'preg_split' v/s'sscanf'作为@Mark Ba​​ker建议。 sscanf会更有效率吗? – 2012-07-13 19:55:57

+0

不能说 - 我会建议做一个测试。使用preg可以让preg执行自己的内存管理。 PHP的变量分配相当昂贵。 – troelskn 2012-07-13 19:59:03

1

而不是使用正则表达式的直线距离,你可以添加例如一个额外的检查:

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秒

而答案应该是sscanf

下面是产生的结果代码:使用preg_split()工作示例

$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'; 
+1

它总是一组阿尔法,然后是数字。 Regex会比sscanf更好吗? – 2012-07-13 19:54:50

1

这里:

$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"