strnatcasecmp

(PHP 4, PHP 5, PHP 7, PHP 8)

strnatcasecmp使用“自然顺序”算法的区分大小写的字符串比较

描述

strnatcasecmp(string $string1, string $string2): int

此函数实现了一个比较算法,该算法以人类理解的方式对字母数字字符串进行排序。此函数的行为类似于 strnatcmp(),只是比较不区分大小写。有关更多信息,请参阅:Martin Pool 的 » 自然顺序字符串比较 页面。

参数

string1

第一个字符串。

string2

第二个字符串。

返回值

与其他字符串比较函数类似,如果 string1 小于 string2,则此函数返回 -1;如果 string1 大于 string2,则返回 1;如果它们相等,则返回 0

变更日志

版本 描述
8.2.0 此函数现在返回 -11,而之前它返回负数或正数。

示例

示例 #1 strnatcasecmp() 示例

<?php

var_dump
(strnatcasecmp('Apple', 'Banana'));
var_dump(strnatcasecmp('Banana', 'Apple'));
var_dump(strnatcasecmp('apple', 'Apple'));
?>

上面的示例将输出

int(-1)
int(1)
int(0)

参见

  • preg_match() - 执行正则表达式匹配
  • strcmp() - 二进制安全字符串比较
  • strcasecmp() - 二进制安全不区分大小写的字符串比较
  • substr() - 返回字符串的一部分
  • stristr() - 不区分大小写的 strstr
  • strncasecmp() - 前 n 个字符的二进制安全不区分大小写的字符串比较
  • strncmp() - 前 n 个字符的二进制安全字符串比较
  • strstr() - 查找字符串的第一次出现
  • setlocale() - 设置区域设置信息

添加备注

用户贡献的注释 3 个注释

chatfielddaniel at googlemail dot com
13 年前
该函数将 '_' 视为字母和数字之后,而从逻辑上讲它应该放在前面。
Marco
8 年前
使用 strnatcmp 来避免下面提到的 _ 问题;

<< 该函数将 '_' 视为字母和数字之后,而从逻辑上讲它应该放在前面。 >>
thomas at uninet dot se
18 年前
strnatcmp 和 strnatcasecmp 的本地化似乎存在错误。我搜索了报告的错误,发现了一些条目,这些条目已有四年的历史(但使用瑞典字符时问题仍然存在)。

这些函数可能会起作用。
<?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);
}
?>

代码没有优化。它只是为了解决我的问题而创建的。
To Top