Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд

Php compare strings

Comparing Strings in PHP

PHP provides several functions for comparing strings. In addition to case-sensitive comparison of two strings with strcmp , you can also perform case-insensitive comparisons with strcasecmp , natural order comparisons with strnatcmp and strnatcasecmp , and comparison of a specified number of characters at the beginning of strings with strncmp . You can also compare one string with a selected portion of another string using substr_compare . Plus you can use comparison operators to compare strings. We will start there.

Comparing Strings with Comparison Operators

PHP comparison operators can be applied to strings. You can check whether two values are equal ( == ) or whether they are identical ( === ). In order to be considered identical, they must have the same value and the same type, while the equal operator performs type conversion when necessary. Consider the following example:

The results of the comparisons tell us that although an integer 27 is equal to a string ’27’ , they are not identical .[1]

Comparing Strings Using Comparison Functions

Pass two string arguments to PHP’s comparison functions and they will return 0 if the two strings are equal, an integer less than zero if the first string is less than the second, or an integer greater than zero if the first string is greater than the second.[2]

The most basic of the string comparison functions is strcmp . Let’s see what happens when we compare the variables we used in the above example:

A return value of 0 indicates that the strcmp function has found the two values to be equal. Although the strcmp function has successfully converted a non-string value to a string for this comparison, you will generally want to be sure that the arguments you pass to string functions are strings. Find out more in our discussion on Variable Type.

Case Sensitivity

The strcmp function performs a case-sensitive comparison. We demonstrate by comparing ‘January’ with ‘january’ :

The result is an integer less than zero, indicating that the first string is less than the second, or in other words, the two strings are not equal. To perform a case-insensitive comparison, use strcasecmp :

This time the result is 0 , indicating that according to the strcasecmp function, the two strings are equal.

Natural Order Comparison

Perhaps you have noticed that when comparing alphanumeric strings, the string comparison functions order them in ways that seem unnatural, even illogical. Consider for example these two strings:

According to the strcmp function, the first string is greater than the second. But how can that make sense, you might wonder? After all, 4 is less than 20. PHP provides the strnatcmp function for this type of comparision:

The result of this comparison finds the first string is less than the second, which is often more desirable for alphanumeric strings.

PHP provides the strnatcasecmp function for case-insensitive natural order comparisons. Consider the example shown below:

If you take case into account in the comparison, $str3 is greater than $str4 . If you want a case-insensitive natural order comparison of the two strings, you can use the strnatcasecmp function which finds that $str3 is less than $str4 .

Comparing the First Part of Strings

PHP provides functions that compare a specified number of characters at the beginning of two strings. The strncmp function performs a case-sensitive comparison while the strncasecmp function performs a case-insensitive comparison. The following demonstrates strncmp :

We pass two strings and an integer that specifies the number of initial characters to compare in the two strings. Our example returns 0 telling us that the initial three characters of the two strings are equal.

The strncasecmp function operates the same way and takes the same arguments. The only difference is that it is case insensitive.

Substring Comparison

The substr_compare function is used to compare a string with any part of a longer string. An offset argument specifies where in the main string the comparison should begin, and an optional length argument specifies where it should end. The following example demonstrates:

The return value of substr_compare is the same as described above for the other string comparison functions. A return value of 0 tells us that our substring ( ‘brownies’ ) is equal to the portion of $str specified by the offset and length arguments.

Find more details about the arguments and options available for substr_compare in the PHP Manual and in our discussion of the related substr function. Find out more about strrpos in our presentation on PHP search functions.


(PHP 4, PHP 5, PHP 7)

strcmp — Бинарно-безопасное сравнение строк


Эта функция учитывает регистр символов.

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

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

Возвращает отрицательное число, если str1 меньше str2 , положительное число, если str1 больше str2 , и 0, если строки равны.


Пример #1 Пример использования strcmp()

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

  • strcasecmp() — Бинарно-безопасное сравнение строк без учета регистра
  • preg_match() — Выполняет проверку на соответствие регулярному выражению
  • substr_compare() — Бинарно-безопасное сравнение 2 строк со смещением, с учетом или без учета регистра
  • strncmp() — Бинарно-безопасное сравнение первых n символов строк
  • strstr() — Находит первое вхождение подстроки
  • substr() — Возвращает подстроку

User Contributed Notes 28 notes

If you rely on strcmp for safe string comparisons, both parameters must be strings, the result is otherwise extremely unpredictable.
For instance you may get an unexpected 0, or return values of NULL, -2, 2, 3 and -3.

Читать еще:  Направления защиты информации

strcmp(«5», 5) => 0
strcmp(«15», 0xf) => 0
strcmp(61529519452809720693702583126814, 61529519452809720000000000000000) => 0
strcmp(NULL, false) => 0
strcmp(NULL, «») => 0
strcmp(NULL, 0) => -1
strcmp(false, -1) => -2
strcmp(«15», NULL) => 2
strcmp(NULL, «foo») => -3
strcmp(«foo», NULL) => 3
strcmp(«foo», false) => 3
strcmp(«foo», 0) => 1
strcmp(«foo», 5) => 1
strcmp(«foo», array()) => NULL + PHP Warning
strcmp(«foo», new stdClass) => NULL + PHP Warning
strcmp(function()<>, «») => NULL + PHP Warning

1) If the two strings have identical BEGINNING parts, they are trunkated from both strings.
2) The resulting strings are compared with two possible outcomes:
a) if one of the resulting strings is an empty string, then the length of the non-empty string is returned (the sign depending on the order in which you pass the arguments to the function)
b) in any other case just the numerical values of the FIRST characters are compared. The result is +1 or -1 no matter how big is the difference between the numerical values.

In Apache/2.4.37 (Win32) OpenSSL/1.1.1 PHP/7.2.12 produces the following results:

(,a) = -1 //comparing with an empty string produces the length of the NON-empty string
(a,) = 1 // ditto
(,afox) = -4 // ditto
(afox,) = 4 // ditto
(,foxa) = -4 // ditto
(foxa,) = 4 // ditto
(a,afox) = -3 // The identical BEGINNING part («a») is trunkated from both strings. Then the remaining «fox» is compared to the remaing empty string in the other argument. Produces the length of the NON-empty string. Same as in all the above examples.
(afox,a) = 3 // ditto
(a,foxa) = -1 // Nothing to trunkate. Just the numerical values of the first letters are compared
(foxa,a) = 1 // ditto
(afox,foxa) = -1 // ditto
(foxa,afox) = 1 // ditto

i hope this will give you a clear idea how strcmp works internally.

One big caveat — strings retrieved from the backtick operation may be zero terminated (C-style), and therefore will not be equal to the non-zero terminated strings (roughly Pascal-style) normal in PHP. The workaround is to surround every « pair or shell_exec() function with the trim() function. This is likely to be an issue with other functions that invoke shells; I haven’t bothered to check.

On Debian Lenny (and RHEL 5, with minor differences), I get this:

Zero-terminated string:
sz = /var/www
str_split(sz) = Array ( [0] => / [1] => v [2] => a [3] => r [4] => / [5] => w [6] => w [7] => w [8] => )

Pascal-style string:
ps = /var/www
str_split(ps) = Array ( [0] => / [1] => v [2] => a [3] => r [4] => / [5] => w [6] => w [7] => w )

Normal results of comparison:
sz == ps = false
strcmp(sz,ps) = 1

Comparison with trim()’d zero-terminated string:
trim(sz) = /var/www
str_split(trim(sz)) = Array ( [0] => / [1] => v [2] => a [3] => r [4] => / [5] => w [6] => w [7] => w )
trim(sz) == ps = true
strcmp(trim(sz),ps) = 0

strcmp returns -1 ou 1 if two strings are not identical,
and 0 when they are, except when comparing a string and an empty string ( ), it returns the length of the string.

Don’t forget the similar_text() function.

Since it may not be obvious to some people, please note that there is another possible return value for this function.

strcmp() will return NULL on failure.

This has the side effect of equating to a match when using an equals comparison (==).
Instead, you may wish to test matches using the identical comparison (===), which should not catch a NULL return.

$variable1 = array();
$ans === strcmp($variable1, $variable2);

This will stop $ans from returning a match;

Please use strcmp() carefully when comparing user input, as this may have potential security implications in your code.

Note a difference between 5.2 and 5.3 versions

echo (int)strcmp(‘pending’,array());
will output -1 in PHP 5.2.16 (probably in all versions prior 5.3)
but will output 0 in PHP 5.3.3

Of course, you never need to use array as a parameter in string comparisions.

Some notes about the spanish locale. I’ve read some notes that says «CH», «RR» or «LL» must be considered as a single letter in Spanish. That’s not really tru. «CH», «RR» and «LL» where considered a single letter in the past (lot of years ago), for that you must use the «Tradictional Sort». Nowadays, the Academy uses the Modern Sort and recomends not to consider anymore «CH», «RR» and «LL» as a single letter. They must be considered two separated letters and sort and compare on that way.

Ju just have to take a look to the Offial Spanish Language Dictionary and you can see there that from many years ago there is not the separated section for «CH», «LL» or «RR» . i.e. words starting with CH must be after the ones starting by CG, and before the ones starting by CI.

In case you want to get results -1, 0 or 1 always, like JS indexOf();

$str2 ) — ( $str1 int(-1) int(-25) int(-25)

$str1 = ‘a’ ;
$str2 = ‘1’ ;
var_dump ( cmp ( $str1 , $str2 ), strcmp ( $str1 , $str2 ));
//=> int(1) int(48) int(48)

strcmp returns strlen($str1)-strlen($str2) when one string is the part of the other string. Otherwise it returns -1 or 1 if two strings are not identical and 0 when they are.

Читать еще:  Php как fastcgi

php dot or dot die at phpuser dot net wrote that he had an unexpected difference in comparing between case sensitive and insensitive. They key there is that the case insensitive comparison converts both strings to lowercase before comparing. Since the underscore character is in a different place when compared to an uppercase or lowercase string, the result is different.

There is no ‘clear’ order of punctuation and other characters in or around the alphabet. Most code assumes ASCII order in which case there are several characters before both upper- and lowercase, a few inbetween, and some after both upper- and lowercase.

Note also many other/older implementations of sorting sort accented character wrong since they appear after all other alphabetical characters in most charactersets. There is probably a function in PHP to take this into account though.

Therefore I would not recommend to make a detailed assumption on how punctuation and other characters sort in relation to alphabetical characters. If sorting these characters at a specific place and in a specific order is important for you, you should probably write a custom string comparison function that does it the way you want. Usually it’s sufficient to have a consistent sorting order though, which is what you get by using either strcmp, or strcasecmp consistently.

In cases when you need to compare a line from a just parsed file stream to match a user-defined «nametag» (useful for parsing ini and configuration files), keep in mind the ‘end of line’ tags as well:

// nametag to look for in a file (notice a required «rn» at the end)
$nametag = «[System]rn»;

// . assuming the file has been aready opened for reading and the stream is bound to $filehandle. parse the file until an EOF or $nametag encountered.

while (!feof ($handle))
$buffer = fgets($filehandle);
if (strcmp($nametag, $buffer) == 0)
// at this point «[System]» is found, do additional parsings.

I have tried the strcmp function. Pls be very carefull. The string comparison must exactly «equal». So many people had confused.

version_compare — Сравнивает две «стандартизованные» строки с номером версии

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

version_compare — Сравнивает две «стандартизованные» строки с номером версии


version_compare() сравнивает две «PHP-стандартизованные» строки с номерами версий.

Функция сначала заменяет _, и + на точку . в строках версий, а также добавляет точки . перед и после каждого символа, не являющегося числом. Например, ‘4.3.2RC1’ преобразуется в ‘4.3.2.RC.1’. После этого сравнивает части строк слева направо. Если часть строки содержит специальные символы версий, они обрабатываются следующим образом: any string not found in this list version1

Старший номер версии.

Младший номер версии.

Если задан третий необязательный аргумент operator , то версии проверяются на соответствие логическому выражению. Возможные операторы: , gt, >=, ge, ==, =, eq, !=, <>, ne.

Аргумент чувствителен к регистру, поэтому значения должны быть в нижнем регистре.

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

По умолчанию, функция version_compare() возвращает -1, если первая версия меньше второй; , когда они равны; 1, если вторая меньше первой.

При использовании аргумента operator функция вернет TRUE , если выражение в соответствии с оператором верно, и FALSE в остальных случаях.


В примере ниже используется константа PHP_VERSION , она содержит номер версии PHP, который выполняет код.

Пример #1 Пример использования version_compare()

= 0 ) <
echo ‘Я использую PHP версии не ниже 6.0.0, моя версия: ‘ . PHP_VERSION . «n» ;

if ( version_compare ( PHP_VERSION , ‘5.3.0’ ) >= 0 ) <
echo ‘Я использую PHP версии не ниже 5.3.0, моя версия: ‘ . PHP_VERSION . «n» ;

if ( version_compare ( PHP_VERSION , ‘5.0.0’ , ‘>=’ )) <
echo ‘Я использую PHP 5, моя версия: ‘ . PHP_VERSION . «n» ;

if ( version_compare ( PHP_VERSION , ‘5.0.0’ , ‘



Константа PHP_VERSION хранит номер текущей версии PHP.


Заметьте, что дорелизные версии, такие как 5.3.0-dev, считаются меньше, чем финальные (вида 5.3.0).


Специальные слова вроде alpha и beta чувствительны к регистру. Строки версий, не придерживающиеся PHP стандарта, нужно приводить к нижнему регистру функцией strtolower() до вызова version_compare() .

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

  • phpversion() — Выдает текущую версию PHP
  • php_uname() — Выдает информацию об операционной системе, на которой запущен PHP
  • function_exists() — Возвращает TRUE, если указанная функция определена

Сравнение строк с помощью == vs. strcmp

Похоже, что PHP-оператор if чувствителен к регистру? Так есть ли причина использовать strcmp() ? Безопасно ли что-то вроде:

Причина его использования заключается в том, что strcmp

возвращает 0, если str1 больше str2 и 0, если они равны.

== только возвращает true или false , это не говорит вам, что является «большой» строкой.

Вы не должны использовать == для сравнения строк. === в порядке.

Просто запустите приведенный выше код, и вы поймете, почему.

Теперь это немного лучше.

Не используйте == в PHP. Он не будет делать то, что вы ожидаете. Даже если вы сравниваете строки со строками, PHP неявно бросает их на float и выполняет численное сравнение, если они выглядят численно.

Например, ‘1e3’ == ‘1000’ возвращает true.

Ну … в соответствии с этим сообщением об ошибке php вы можете даже получить Owned.

Это дает вам предупреждение, но все же обходит сравнение.
Вы должны делать === как предлагал @postfuturist.

Всегда помните, что при сравнении строк вы должны использовать оператор === operator (строгое сравнение) и не == (потерять сравнение).

Читать еще:  Голытьба index php action printpage topic

Использование == может быть опасным.

Обратите внимание, что он переместит переменную в другой тип данных, если они отличаются друг от друга.

  • echo (1 == ‘1’) ? ‘true’ : ‘false’;
  • echo (1 == true) ? ‘true’ : ‘false’;

Как вы можете видеть, эти два относятся к разным типам, но результат true , что может и не быть тем, что ожидает ваш код.

Использование === , однако, рекомендуется, так как тест показывает, что он немного быстрее, чем strcmp() и его альтернативна strcasecmp() регистра.

Быстрый googling кричит это сравнение скорости: http://snipplr.com/view/758/

strcmp () и «===» чувствительны к регистру, но «===» выполняется намного быстрее

strcmp вернет различные значения в зависимости от среды, в которой он работает (Linux / Windows)!

Причина в том, что у него есть ошибка, так как в отчете об ошибке говорится: https://bugs.php.net/bug.php?id=53999

Пожалуйста, обращайтесь с осторожностью! Спасибо.

Подводя итог всем ответам:

== – плохая идея для сравнения строк.
Во многих случаях это даст вам «неожиданные» результаты. Не верьте этому.

=== хорошо, и даст вам лучшую производительность.

strcmp() следует использовать, если вам нужно определить, какая строка «больше», как правило, для операций сортировки.

Также функция может помочь в сортировке. Для более четкого определения сортировки. strcmp () возвращает меньше 0, если string1 сортирует перед string2, больше 0, если string2 сортирует перед строкой1 или 0, если они одинаковы. Например

Функция вернет больше нуля, поскольку aaao сортирует перед aabo.

Вы можете использовать strcmp() если хотите заказать / сравнить строки лексикографически . Если вы просто хотите проверить равенство, тогда == просто отлично.

PHP Сравнение Строк

У меня есть две строки, которые выглядят одинаково, когда я эхо их, но когда я var_dump() их они разные типы строк:

Когда я сравниваю их, они возвращают ложь. Как я могу манипулировать строковым типом, чтобы я мог выполнить сравнение, которое возвращает true. В чем разница между строкой 11 и строкой 14? Я уверен, что есть простое разрешение, но еще ничего не нашел, независимо от того, как я взрываю, взрываю, кодирую UTF8 и т. д. строки, которые они не будут сравнивать или изменять тип.

Спасибо за вашу помощь!

6 Ответов

Буква «a» может быть написана в другой кодировке.
Например: blаh -здесь a -это кириллица ‘а’.
Все эти буквы кириллицы, но похоже на латынь: у, е, х, а, р, о, с

Обрезать строки перед сравнением, есть экранированные символы, такие как t и n, которые не видны.

Если используется var_dump() , то string(14) означает, что значение string содержит 14 байт. Так что string(11) и string(14) -это не разные «types» строки, это просто строки разной длины.

Я бы использовал что-то вроде этого, чтобы увидеть, что на самом деле находится внутри этих строк:

Это расшифровывается как:

Или, как указано в комментариях @Karolis,, вы можете использовать встроенную функцию bin2hex() :

Вы уже пробовали обрезать эти струны?

Вероятно, строки Юникода в верхнем диапазоне считаются двойными байтами.

Используйте mb_strlen для проверки длины.

Кроме того, некоторые символы могут быть не видны, но присутствуют (есть много пробелов unicode и т. д.)

Как правило, при работе с функциями Юникода следует использовать строковые функции mb_* .

Вы можете перегрузить функции кодирования строк в php.ini , чтобы всегда использовать функции mb_* вместо стандартных (не уверен, что xdebug соблюдает эти настройки).

В PHP 6 эта проблема будет решена, так как она должна быть глобально известна Unicode.

Похожие вопросы:

У меня возникли проблемы с PHP сравнение строк. Он никогда не оказывается равным 0. Ниже я пытаюсь получить настройку в файле cookie и сравнить ее с заданным ключом и вернуть значение этого файла.

Мне нужно сравнить (на самом деле rank/sort) дат в PHP скрипте. Даты имеют формат даты ISO-8601, т. е. YYYY-MM-DD Я написал функцию сравнения, которая разбивает даты и сравнивает на year/month/day.

я сохранил два значения ip-адреса в двух строках a = ‘’ b = ‘’ я просто хочу сравнить первые две части ip-адреса, т. е. часть 116.95 в двух строках, и поскольку она.

Я разбираю a shell_exec , для которого я получаю ряд строк результата, которые я сравниваю с данными из других источников. Входной текст shell содержит ANSI цветных текста, которые я, кажется, не.

Я использую PHP 7.0 и я хочу сделать только сравнение строк. PHP имеет функцию strpos strcmp для этого, но я не знаю, какая функция будет быстрой и безопасной для сравнения строк. Мне нужно сравнить.

Сравнение строк в PHP кажется немного сложным. Я не знаю, есть ли другие способы сделать это. Например скажем: $t1 = CEO; $t2 = Chairman; $t3 = Founder; $title = CEO, Chairman of the Board; if.

Я столкнулся со странным и неожиданным поведением в PHP при сравнении некоторых строковых значений. Первые два утверждения ниже возвращают true, когда я ожидаю, что они вернут false. Последний.

Есть ли какое-либо решение, чтобы иметь функцию сравнения строк в PHP, идентичную JavaScript string.localeCompare() ? Моя цель-сделать хэшер, который может быть применен к простым объектам в PHP и в.

Сопоставление / сравнение текстовых строк в PHP Привет всем, Я пытаюсь сравнить некоторые строки, в основном, чтобы понять, есть ли у меня продукт в ленте продуктов. Поскольку источники отличаются.

Я хочу, чтобы пользователь мог ввести номер купона, чтобы получить скидку. После ввода и отправки номера купона страница перезагружается с галочкой, показывающей, что они ввели правильную сумму. То.

Ссылка на основную публикацию