我有几个格式的字符串
AA11 AAAAAA1111111 AA1111111
哪种是分隔字符串的字母和数字组件的最佳(最有效)方法?
如果它们都是一系列 alpha,后跟一系列数字,没有非字母字符,那么sscanf()可能比 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 库在处理字符串方面出奇地高效,因此我认为它比您可以使用更原始的字符串函数手动编写的任何东西都更有效。但是做一个测试,看看你自己。
您可以添加一项额外的检查,而不是立即使用 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
}
编辑:显然我的回答没有给出表现更好的证据,这就是为什么我做了一个产生以下结果的测试:
答案应该是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';
这是一个使用的工作示例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"
这似乎可行,但是当您尝试传递“ 111111 ”之类的内容时,它不起作用。
在我的应用程序中,我期待几种情况,似乎在做的就是这个
$referenceNumber = "AAA12132";
$splited = preg_split('/(\d+)/', $referenceNumber, -1, PREG_SPLIT_DELIM_CAPTURE);
var_dump($splited);
注意:
因此,鉴于上述情况,您可以根据您的用例来使用它。
干杯!