strnatcasecmp()
(PHP 4, PHP 5, PHP 7)
使用“自然顺序”算法比较字符串(不区分大小写)
说明
strnatcasecmp(string $str1, string $str2) : int
该函数实现了以人类习惯对数字型字符串进行排序的比较算法。除了不区分大小写,该函数的行为与strnatcmp()类似。更多信息,参见:Martin Pool 的»自然顺序的字符串比较页面。
参数
- $str1
第一个字符串。
- $str2
第二个字符串。
返回值
与其他字符串比较函数类似,如果$str1小于$str2返回< 0;如果$str1大于$str2返回> 0;如果两者相等,返回 0。
参见
preg_match()
执行匹配正则表达式strcmp()
二进制安全字符串比较strcasecmp()
二进制安全比较字符串(不区分大小写)substr()
返回字符串的子串stristr()
strstr 函数的忽略大小写版本strncasecmp()
二进制安全比较字符串开头的若干个字符(不区分大小写)strncmp()
二进制安全比较字符串开头的若干个字符strstr()
查找字符串的首次出现setlocale()
设置地区信息
Use strnatcmp to avoid the _ problem as mentioned below; << The function treats '_' as after letters and numbers when it would be placed before logically. >>
The function treats '_' as after letters and numbers when it would be placed before logically.
There seems to be a bug in the localization for strnatcmp and strnatcasecmp. I searched the reported bugs and found a few entries which were up to four years old (but the problem still exists when using swedish characters). These functions might work instead. <?php function _strnatcasecmp($left, $right) { return _strnatcmp(strtolower($left), strtolower($right)); } function _strnatcmp($left, $right) { while((strlen($left) > 0) && (strlen($right) > 0)) { if(preg_match('/^([^0-9]*)([0-9].*)$/Us', $left, $lMatch)) { $lTest = $lMatch[1]; $left = $lMatch[2]; } else { $lTest = $left; $left = ''; } if(preg_match('/^([^0-9]*)([0-9].*)$/Us', $right, $rMatch)) { $rTest = $rMatch[1]; $right = $rMatch[2]; } else { $rTest = $right; $right = ''; } $test = strcmp($lTest, $rTest); if($test != 0) { return $test; } if(preg_match('/^([0-9]+)([^0-9].*)?$/Us', $left, $lMatch)) { $lTest = intval($lMatch[1]); $left = $lMatch[2]; } else { $lTest = 0; } if(preg_match('/^([0-9]+)([^0-9].*)?$/Us', $right, $rMatch)) { $rTest = intval($rMatch[1]); $right = $rMatch[2]; } else { $rTest = 0; } $test = $lTest - $rTest; if($test != 0) { return $test; } } return strcmp($left, $right); } ?> The code is not optimized. It was just made to solve my problem.