strnatcasecmp

(PHP 4, PHP 5)

strnatcasecmpСравнение строк без учета регистра с использованием алгоритма "natural order"

Описание

int strnatcasecmp ( string $str1 , string $str2 )

Эта функция реализует алгоритм сравнения, упорядочивающий алфавитно-цифровые строки подобно тому, как это сделал бы человек. Эта функция подобна strnatcmp(), за исключением того, что сравнение происходит без учета регистра символов. Для получения дополнительной информации см. » Natural Order String Comparison

Список параметров

str1

Первая строка.

str2

Вторая строка.

Возвращаемые значения

Подобно другим функциям сравнения строк, данная функция возвращает отрицательное число, если str1 меньше, чем str2, положительное число, если str1 больше, чем str2, и 0 если строки равны.

Смотрите также

  • preg_match() - Выполняет проверку на соответствие регулярному выражению
  • strcmp() - Бинарно-безопасное сравнение строк
  • strcasecmp() - Бинарно-безопасное сравнение строк без учета регистра
  • substr() - Возвращает подстроку
  • stristr() - Регистро-независимый вариант функции strstr
  • strncasecmp() - Бинарно-безопасное сравнение первых n символов строк без учета регистра
  • strncmp() - Бинарно-безопасное сравнение первых n символов строк
  • strstr() - Находит первое вхождение подстроки
  • setlocale() - Устанавливает настройки локали

Коментарии

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.
2006-07-25 03:49:17
http://php5.kiev.ua/manual/ru/function.strnatcasecmp.html
The function treats '_' as after letters and numbers when it would be placed before logically.
2011-04-14 07:07:28
http://php5.kiev.ua/manual/ru/function.strnatcasecmp.html
Автор:
Use strnatcmp to avoid the _ problem as mentioned below;

<<  The function treats '_' as after letters and numbers when it would be placed before logically. >>
2016-05-20 13:12:17
http://php5.kiev.ua/manual/ru/function.strnatcasecmp.html

    Поддержать сайт на родительском проекте КГБ