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


PHP: Best way to split string into alphabetic and numeric components

我有几个格式的字符串

AA11
AAAAAA1111111
AA1111111

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

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

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

preg_split应该可以胜任这项工作。

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

preg库在处理字符串方面效率惊人,所以我认为它比使用更原始的字符串函数手工编写的任何东西都更高效。但做一个测试,看看你自己。

下面是一个使用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);

该输出:

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

您可以添加一个额外的检查,而不是直接使用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. 预裂耗时5.3319189548492秒
  2. sscanf耗时3.4432129859924秒

答案应该是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';

这似乎有效,但当您试图传递类似"1111111"的内容时,它不会。

在我的应用程序中,我预计会有几个场景,而似乎起作用的是这个

$referenceNumber = "AAA12132";
$splited = preg_split('/('d+)/', $referenceNumber, -1, PREG_SPLIT_DELIM_CAPTURE);
var_dump($splited);

注意

  1. 得到一个由2个元素组成的数组,意味着第0个索引是阿尔法,而第1个索引是数字
  2. 只得到一个元素的数组,意味着第0个元素是数字,没有字母
  3. 如果您获得了2个以上的数组项,那么您的字符串必须采用以下格式"AAA1323SDC"

因此,考虑到以上内容,您可以根据您的用例来使用它

干杯!