strcmp — Сравнение строк, безопасное для данных в двоичной форме


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

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

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

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

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

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

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

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

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

Например, ‘1e3’ == ‘1000’ возвращает true. Вы должны использовать === вместо этого.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Обращайтесь с осторожностью! Спасибо.

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

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

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

PHP Вместо использования алфавитной сортировки, используйте значение ASCII символа для сравнения. Строчные буквы имеют более высокое значение ASCII, чем заглавные. Лучше использовать оператор идентичности === для такого сравнения. strcmp() — это функция для сравнения безопасных двоичных строк. Он принимает две строки в качестве аргументов и возвращает 0, если str1 больше, чем str2, и 0, если они равны. Существует также версия без учета регистра с именем strcasecmp(), которая сначала преобразует строки в строчные, а затем сравнивает их.

CXLVI. Функции обработки строк

Эти функции предназначены для выполнения различных манипуляций со строками. Более специализированные функции см. в разделах, посвященных регулярным выражениям и обработке URL .

Для получения общей информации о работе со строками, особенно об использовании одиночных и двойных кавычек и экранировании символов, смотрите главу «Строки» в разделе «Типы» .

Эти функции всегда доступны.

Для использования этих функций не требуется проведение установки, поскольку они являются частью ядра PHP.

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

Для получения информации о более сложной обработке строк обратитесь к разделам о регулярных выражениях: POSIX-совместимых и Perl-совместимых .

Пред. Начало След.
stream_wrapper_unregister Уровень выше addcslashes

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:

strcmp, wcscmp, _mbscmp, _mbscmp_l strcmp, wcscmp, _mbscmp, _mbscmp_l

Сравнивают строки. Compare strings.

_mbscmp и _mbscmp_l нельзя использовать в приложениях, которые выполняются в среда выполнения Windows. _mbscmp and _mbscmp_l cannot be used in applications that execute in the Windows Runtime. Дополнительные сведения: Функции CRT, которые не поддерживаются в приложениях универсальной платформы Windows. For more information, see CRT functions not supported in Universal Windows Platform apps.

Синтаксис Syntax

Параметры Parameters

строка1, строка2 string1, string2
Строки с завершающим нулем для сравнения. Null-terminated strings to compare.

locale locale
Используемый языковой стандарт. Locale to use.

Возвращаемое значение Return Value

Возвращаемое значение для каждой из этих функций Указывает порядковое отношение строка1 к строка2. The return value for each of these functions indicates the ordinal relation of string1 to string2.

Значение Value Отношение string1 к string2 Relationship of string1 to string2
строка1 меньше, чем строка2 string1 is less than string2
0 0 строка1 совпадает с строка2 string1 is identical to string2
> 0 > 0 строка1 больше, чем строка2 string1 is greater than string2

При ошибке проверки параметров _mbscmp и _mbscmp_l возвращают _NLSCMPERROR, который определен в <> String. h > и On a parameter validation error, _mbscmp and _mbscmp_l return _NLSCMPERROR, which is defined in and .

Примечания Remarks

Функция strcmp выполняет порядковое сравнение строк строка1 и строка2 и возвращает значение, указывающее их связь. The strcmp function performs an ordinal comparison of string1 and string2 and returns a value that indicates their relationship. wcscmp и _mbscmp — это версии strcmp, соответственно, расширенных символов и многобайтовых символов. wcscmp and _mbscmp are, respectively, wide-character and multibyte-character versions of strcmp. _mbscmp распознает последовательности многобайтовых символов в соответствии с текущей многобайтовой кодовой страницей и возвращает _NLSCMPERROR при возникновении ошибки. _mbscmp recognizes multibyte-character sequences according to the current multibyte code page and returns _NLSCMPERROR on an error. _mbscmp_l имеет то же поведение, но использует переданный параметр языкового стандарта вместо текущего языкового стандарта. _mbscmp_l has the same behavior, but uses the locale parameter that’s passed in instead of the current locale. Дополнительные сведения см. в разделе Кодовые страницы. For more information, see Code Pages. Кроме того, если строка1 или строка_замены является пустым указателем, _mbscmp вызывает обработчик недопустимого параметра, как описано в разделе Проверка параметров. Also, if string1 or string2 is a null pointer, _mbscmp invokes the invalid parameter handler, as described in Parameter Validation. Если выполнение может быть продолжено, _mbscmp и _Mbscmp_l возвращают _NLSCMPERROR и присвойте параметру » No » значение » еинвал«. If execution is allowed to continue, _mbscmp and _mbscmp_l return _NLSCMPERROR and set errno to EINVAL. strcmp и wcscmp не проверяют свои параметры. strcmp and wcscmp do not validate their parameters. В остальном эти функции ведут себя одинаково. These functions behave identically otherwise.

Сопоставления подпрограмм обработки обычного текста Generic-Text Routine Mappings

Подпрограмма TCHAR.H TCHAR.H routine _UNICODE и _MBCS не определены _UNICODE & _MBCS not defined _MBCS определено _MBCS defined _UNICODE определено _UNICODE defined
_tcscmp _tcscmp strcmp strcmp _mbscmp _mbscmp wcscmp wcscmp

Функции strcmp отличаются от функций strcoll в том, что strcmp сравнения являются порядковыми и не зависят от языкового стандарта. The strcmp functions differ from the strcoll functions in that strcmp comparisons are ordinal, and are not affected by locale. strcoll сравнивает строки лексикографически, используя категорию LC_COLLATE текущего языкового стандарта. strcoll compares strings lexicographically by using the LC_COLLATE category of the current locale. Дополнительные сведения о категории LC_COLLATE см. в разделе setlocale, _wsetlocale. For more information about the LC_COLLATE category, see setlocale, _wsetlocale.

В языковом стандарте «C» порядок символов в наборе символов (набор символов ASCII) совпадает с лексикографическим порядком символов. In the «C» locale, the order of characters in the character set (ASCII character set) is the same as the lexicographic character order. Однако в других языковых стандартах порядок символов в наборе символов может отличаться от лексикографического порядка. However, in other locales, the order of characters in the character set may differ from the lexicographic order. Например, в некоторых европейских языковых стандартах символ a (значение 0x61) предшествует символу ä (значение 0xE4) в наборе символов, но ä предшествует символу a лексикографически. For example, in certain European locales, the character ‘a’ (value 0x61) comes before the character ‘ä’ (value 0xE4) in the character set, but the character ‘ä’ comes in front of the character ‘a’ lexicographically.

В языковых стандартах, для которых кодировка и порядок символов лексикографическим порядком различаются, можно использовать strcoll вместо strcmp для лексикографическим порядком сравнения строк. In locales for which the character set and the lexicographic character order differ, you can use strcoll instead of strcmp for lexicographic comparison of strings. Кроме того, можно использовать стрксфрм для исходных строк, а затем использовать strcmp в результирующих строках. Alternatively, you can use strxfrm on the original strings, and then use strcmp on the resulting strings.

В функциях strcmp учитывается регистр. The strcmp functions are case-sensitive. стрикмп, вксикмп и_ мбсикмп сравниваютстроки,сначалапреобразуяих_ в их формы в нижнем регистре. _ _stricmp, _wcsicmp, and _mbsicmp compare strings by first converting them to their lowercase forms. Две строки, содержащие символы, расположенные между «Z» и «a» в таблице ASCII («[«, «\», «]», «^», «» и «`»), сравниваются по-разному в зависимости от их регистра. Two strings that contain characters that are located between ‘Z’ and ‘a’ in the ASCII table (‘[‘, ‘\’, ‘]’, ‘^’, », and ‘`’) compare differently, depending on their case. Например, две строки «ABCD» и «ABCD ^» сравнивают один из них, если сравнение является строчным («ABCDE» > «abcd ^»), а другой способ («ABCD» For example, the two strings «ABCDE» and «ABCD^» compare one way if the comparison is lowercase («abcde» > «abcd^») and the other way («ABCDE»

Требования Requirements

Подпрограмма Routine Обязательный заголовок Required header
strcmp strcmp
wcscmp wcscmp или or
_mbscmp _mbscmp

Дополнительные сведения о совместимости см. в разделе Совместимость. For additional compatibility information, see Compatibility.

Strcmp — Сравнение строк, безопасное для данных в двоичной форме

addcslashes — Экранирует спецсимволы в стиле языка C
addslashes — Экранирует спецсимволы в строке
bin2hex — Преобразует бинарные данные в шестнадцатиричное представление
chr — Возвращает символ по его коду
chunk_split — Разбивает строку на фрагменты
convert_cyr_string — Преобразует строку из одной кириллической кодировки в другую
count_chars — Возвращает информацию о символах, входящих в строку
crc32 — Вычисляет CRC32 для строки
crypt — Необратимое шифрование (хэширование)
echo — Выводит одну или более строк
explode — Разбивает строку на подстроки
fprintf — Записывает отформатированную строку в поток
get_html_translation_table — Возвращает таблицу преобразований
hebrev — Преобразует текст на иврите из логической кодировки в визуальную
hebrevc — Преобразует текст на иврите из логической кодировки в визуальную с преобразованием перевод
htmlentities — Преобразует символы в соответствующие HTML сущности
htmlspecialchars — Преобразует специальные символы в HTML сущности
html_entity_decode — Преобразует HTML сущности в соответствующие символы
implode — Объединяет элементы массива в строку
localeconv — Возвращает информацию о числовых форматах
ltrim — Удаляет пробелы из начала строки
md5 — Возвращает MD5 хэш строки
md5_file — Возвращает MD5 хэш файла
metaphone — Возвращает ключ metaphone для строки
nl2br — Вставляет HTML код разрыва строки перед каждым переводом строки
number_format — Форматирует число с разделением групп
ord — Возвращает ASCII код символа
parse_str — Разбирает строку в переменные
print — Выводит строку
printf — Выводит отформатированную строку
quoted_printable_decode — Раскодирует строку, закодированную методом quoted printable
quotemeta — Экранирует специальные символы
rtrim — Удаляет пробелы из конца строки
sha1 — Возвращает SHA1 хэш строки
sha1_file — Возвращает SHA1 хэш файла
similar_text — Вычисляет степень похожести двух строк
soundex — Возвращает ключ soundex для строки
sprintf — Возвращает отформатированную строку
sscanf — Разбирает строку в соответствии с заданным форматом
strcasecmp — Сравнение строк без учета регистра, безопасное для данных в двоичной форме
strcmp — Сравнение строк, безопасное для данных в двоичной форме
strcoll — Сравнение строк с учетом текущей локали
strcspn — Возвращает длину участка в начале строки, не соответствующего маске
stripcslashes — Удаляет экранирование символов, произведенное функцией addcslashes()
stripos — Возвращает позицию первого вхождения подстроки без учета регистра
stripslashes — Удаляет экранирование символов, произведенное функцией addslashes()
strip_tags — Удаляет HTML и PHP тэги из строки
stristr — Аналог функции strstr, но независит от регистра
strlen — Возвращает длину строки
strnatcasecmp — Сравнение строк без учета регистра с использованием алгоритма
strnatcmp — Сравнение строк с использованием алгоритма «естественного упорядочения»
strncasecmp — Сравнение первых n символов строк без учета регистра, безопасное для данных в двоичной форме
strncmp — Сравнение первых n символов строк без учета регистра, безопасное для данных в двоичной форме
strpos — Находит первое вхождение подстроки в строку
strrchr — Находит последнее вхождение символа в строку
strrev — Переворачивает строку
strripos — Возвращает позицию последнего вхождения подстроки без учета регистра
strrpos — Находит последнее вхождение символа в строку
strspn — Возвращает длину участка в начале строки, соответствующего маске
strstr — Находит первое вхождение подстроки
strtok — Разбивает строку
strtolower — Преобразует строку в нижний регистр
strtoupper — Преобразует строку в верхний регистр
strtr — Преобразует заданные символы
str_ireplace — Регистро-независимый вариант функции str_replace().
str_pad — Дополняет строку другой строкой до заданной длины
str_repeat — Возвращает повторяющуюся строку
str_replace — Заменяет строку поиска на строку замены
str_rot13 — Выполняет над строкой преобразование ROT13
str_shuffle — Переставляет символы в строке
str_split — Преобразует строку в массив
str_word_count — Возвращает информацию о словах, входящих в строку
substr — Функция возвращает часть строки
substr_count — Подсчитывает число вхождений подстроки в строку
substr_replace — Заменяет часть строки
trim — Удаляет пробелы из начала и конца строки
ucfirst — Преобразует первый символ строки в верхний регистр
ucwords — Преобразует в верхний регистр первый символ каждого слова в строке
vprintf — Выводит отформатированную строку
vsprintf — Возвращает отформатированную строку
wordwrap — Выполняет перенос строки на данное количество символов с использованием символа разрыва строки

Особенности операторов сравнения применительно к строкам.

Функция chop( ) возвращает строку после удаления из нее завершающих пропусков и символов новой строки. Синтаксис функции chop( ):

string chop(string строка)

В следующем примере функция chop( ) удаляет лишние символы новой строки:

Функция str_pad( ) выравнивает строку до определенной длины заданными символами и возвращает отформатированную строку. Синтаксис функции str_pad( ):

string str_pad (string строка, int длина_дополнения [, string дополнение [, int тип_дополнения]])

Если необязательный параметр дополнение не указан, строка дополняется пробелами. В противном случае строка дополняется заданными символами. По умолчанию строка дополняется справа; тем не менее, вы можете передать в параметре тип_дополнения константу STR_PAD_RIGHT, STR_PAD_LEFT или STR_PAD_BOTH, что приведет к дополнению строки в заданном направлении. Пример демонстрирует дополнение строки функцией str_pad( ) с параметрами по умолчанию:

В следующем примере используются необязательные параметры функции str_pad( ):

Функция trim( ) удаляет псе пропуски с обоих краев строки и возвращает полученную строку. Синтаксис функции trim( ):

string trim (string страна]

К числу удаляемых пропусков относятся и специальные символы \n, \r, \t, \v и \0.
ltrim()

Функция lrim( ) удаляет все пропуски и специальные символы с левого края строки и возвращает полученную строку. Синтаксис функции ltrim( ):

string ltrim (string строка)


Функция удаляет те же специальные символы, что и функция trim( ).
strlen()
Определение длины строки

Длину строки в символах можно определить при помощи функции strlen( ). Синтаксис .функции strlen( ):

int strlen (string строка)

Следующий пример демонстрирует определение длины строки функцией strlen( ):

Сравнение двух строк

Сравнение двух строк принадлежит к числу важнейших строковых операций любого языка. Хотя эту задачу можно решить несколькими разными способами, в РНР существуют четыре функции сравнения строк:

strcmp()
strcasecmp()
strspn()
strcspn()

Функция strcmp( ) сравнивает две строки с учетом регистра символов. Синтаксис функции strcmp( ): int strcmp (string строка1, string строка2)

После завершения сравнения strcmp( ) возвращает одно из трех возможных значений:

0, если строка1 и строка2 совпадают;
0, если строка2 меньше, чем строка1.

В следующем фрагменте сравниваются две одинаковые строки:

Функция strcasecmp( ) работает точно так же, как strcmp( ), за одним исключением — регистр символов при сравнении не учитывается. Синтаксис функции strcasecmp( ):

int strcasecmp (string cтpoкa1, string строка2)

В следующем фрагменте сравниваются две одинаковые строки:

Функция strspn( ) возвращает длину первого сегмента строки1, содержащего символы, присутствующие в строке2. Синтаксис функции strspn( ):

int strspn (string строка1, string строка2)

Следующий фрагмент показывает, как функция strspn( ) используется для проверки пароля:

Функция strcspn( ) возвращает длину первого сегмента строки1, содержащего символы, отсутствующие в строке2. Синтаксис функции strcspn( ):

int strcspn (string строка1, string строка2)

В следующем фрагменте функция strcspn( ) используется для проверки пароля:

Обработка строковых данных без применения регулярных выражений

При обработке больших объемов информации функции регулярных выражений сильно замедляют выполнение программы. Эти функции следует применять лишь при обработке относительно сложных строк, в которых регулярные выражения действительно необходимы. Если же анализ текста выполняется по относительно простым правилам, можно воспользоваться стандартными функциями РНР, которые заметно ускоряют обработку. Все эти функции описаны ниже.
strtok()

Функция strtok( ) разбивает строку на лексемы по разделителям, заданным вторым параметром. Синтаксис функции strtok( ):

string strtok (string строка, string разделители)

У функции strtok( ) есть одна странность: чтобы полностью разделить строку, функцию необходимо последовательно вызвать несколько раз. При очередном вызове функция выделяет из строки следующую лексему. При этом параметр строка задается всего один раз — функция отслеживает текущую позицию в строке до тех пор, пока строка не будет полностью разобрана на лексемы или не будет задан новый параметр строка. Следующий пример демонстрирует разбиение строки по нескольким разделителям:

Результат: Element = WJGilmore Element = wjgilmore@hotmail.com Element = Columbus Element = Ohio
parse_str()

Функция parse_str( ) выделяет в строке пары и присваивает значения переменных в текущей области видимости. Синтаксис функции parse_str( ):

void parse_str (string строка)

Функция parse_str( ) особенно удобна при обработке URL, содержащих данные форм HTML или другую расширенную информацию. В следующем примере анализируется информация, переданная через URL. Строка представляет собой стандартный способ передачи данных между страницами либо откомпилированных в гиперссылке, либо введенных в форму HTML:

Поскольку эта функция создавалась для работы с URL, она игнорирует символ амперсанд (&).
explode()

Функция explode() делит строку на элементы и возвращает эти элементы в виде массива. Синтаксис функции explode():

array explode (string разделитель, string строка [, int порог])

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

Разделение строки функцией explode( ) продемонстрировано в следующем примере:

Функция explode( ) практически идентична функции регулярных выражений POSIX split( ), описанной выше. Главное различие заключается в том, что передача регулярных выражений в параметрах допускается только при вызове split( ).
implode()

Если функция explode( ) разделяет строку на элементы массива, то ее двойник — функция implode( ) — объединяет массив в строку. Синтаксис функции implode( ):

string implode (string разделитель, array фрагменты)

Формирование строки из массива продемонстрировано в следующем примере:

У implode( ) имеется псевдоним — функция join( ).
strpos()

Функция strpos( ) находит в строке первый экземпляр заданной подстроки. Синтаксис функции strpos():

int strpos (string строка, string подстрока [, int смещение])

Необязательный параметр offset задает позицию, с которой должен начинаться поиск. Если подстрока не найдена, strpos() возвращает FALSE (0).

В следующем примере определяется позиция первого вхождения даты в файл журнала:

Функция strrpos( ) находит в строке последний экземпляр заданного символа. Синтаксис функции strrpos( ):

int strpos (string строка, char символ)

По возможностям эта функция уступает своему двойнику — функции strpos( ), поскольку она позволяет искать только отдельный символ, а не всю строку. Если во втором параметре strrpos( ) передается строка, при поиске будет использован только ее первый символ.
str_replace()

Функция str_replace( ) ищет в строке все вхождения заданной подстроки и заменяет их новой подстрокой. Синтаксис функции str_replace( ):

string str_replace (string подстрока, string замена, string строка)

Функция substr_replace( ), описанная ниже в этом разделе, позволяет провести заме ну лишь в определенной части строки. Ниже показано, как функция str_replace( ) используется для проведения глобальной замены в строке.

Если подстрока ни разу не встречается в строке, исходная строка не изменяется:

Функция strstr( ) возвращает часть строки, начинающуюся с первого вхождения заданной подстроки. Синтаксис функции strstr( ):

string strstr (string строка, string подстрока)

В следующем примере функция strstr( ) используется для выделения имени домена из URL:

Функция substr( ) возвращает часть строки, начинающуюся с заданной начальной позиции и имеющую заданную длину. Синтаксис функции substr( ):

string substr (string строка, int начало [, int длина])

Если необязательный параметр длина не указан, считается, что подстрока начинается с заданной начальной позиции и продолжается до конца строки. При использовании этой функции необходимо учитывать четыре обстоятельства:

если параметр начало положителен, возвращаемая подстрока начинается с позиции строки с заданным номером;
если параметр начало отрицателен, возвращаемая подстрока начинается с позиции (длина строки — начало);
если параметр длина положителен, в возвращаемую подстроку включаются все символы от позиции начало до позиции начало+длина. Если последняя величина превышает длину строки, возвращаются символы до конца строки;
если параметр длина отрицателен, возвращаемая подстрока заканчивается на заданном расстоянии от конца строки.

Помните о том, что параметр начало определяет смещение от первого символа строки; таким образом, возвращаемая строка в действительности начинается с символа с номером (начало + 1).

Следующий пример демонстрирует выделение части строки функцией substr( ):

Пример с положительным параметром длина:

Пример с отрицательным параметром длина:

substr_count()
Функция substr_count( ) возвращает количество вхождений подстроки в заданную строку. Синтаксис функции substr_count( ): int substr_count (string строка, string подстрока) В следующем примере функция substr_count( ) подсчитывает количество вхождений подстроки ain:

Функция substr_replace( ) заменяет часть строки, которая начинается с заданной позиции. Если задан необязательный параметр длина, заменяется фрагмент заданной длины; в противном случае производится замена по всей длине заменяющей строки. Синтаксис функции substr_replace( ):

string substr_replace (string строка, string замена, int начало [, int длина])

Параметры начало и длина задаются по определенным правилам:

если параметр начало положителен, замена начинается с заданной позиции;
если параметр начало отрицателен, замена начинается с позиции (длина строки -начало);
если параметр длина положителен, заменяется фрагмент заданной длины;
если параметр длина отрицателен, замена завершается в позиции (длина строки -длина).

Простая замена текста функцией substr_replace( ) продемонстрирована в следующем примере:

Alessia’s favorite links
Преобразование строк и файлов к формату HTML и наоборот

Преобразовать строку или целый файл к формату, подходящему для просмотра в web-браузере (или наоборот), проще, чем может показаться на первый взгляд. В РНР для этого существуют специальные функции.
Преобразование текста в HTML

Быстрое преобразование простого текста к формату web-браузера — весьма распространенная задача. В ее решении вам помогут функции, описанные в этом разделе.
nl2br()

Функция nl2br() заменяет все символы новой строки (\n) эквивалентными конструкциями HTML.

Синтаксис функции nl2br():

string nl2br (string строка)

Символы новой строки могут быть как видимыми (то есть явно включенными в строку), так и невидимыми (например, введенными в редакторе). В следующем примере текстовая строка преобразуется в формат HTML посредством замены символов \n разрывами строк:

При последующем выводе $html_recipe браузеру будет передан следующий текст в формате HTML:

Party Sauce recipe:


1 can stewed tomatoes

3 tablespoons fresh lemon juice

Stir together, server cold.

Функция htmlentities( ) преобразует символы в эквивалентные конструкции HTML. Синтаксис функции htmlentities:

string htmlentities (string строка)

В следующем примере производится необходимая замена символов строки для вывода в браузере:

Функция htmlentities( ) в настоящее время работает только для символов кодировки ISO-8559-1 (ISO-Latin-1). Кроме того, она не преобразует пробелы в , как следовало бы ожидать.
htmlspecialchars()

Функция htmlspecialchars( ) заменяет некоторые символы, имеющие особый смысл в контексте HTML, эквивалентными конструкциями HTML. Синтаксис функции htmlspecialchars( ):

string htmlspecialchars (string строка)

Функция html special chars( ) в настоящее время преобразует следующие символы: & преобразуется в &; » » преобразуется в «; преобразуется в >.

В частности, эта функция позволяет предотвратить ввод пользователями разметки HTML в интерактивных web-приложениях (например, в электронных форумах). Ошибки, допущенные в разметке HTML, могут привести к тому, что вся страница будет формироваться неправильно. Впрочем, у этой задачи существует и более эффективное решение — полностью удалить теги из строки функцией strip_tags( ).

Следующий пример демонстрирует удаление потенциально опасных символов функцией htmlspeclalchars( ):

Если функция htmlspecialchars( ) используется в сочетании с nl2br( ), то последнюю следует вызывать после htmlspecialchars( ). В противном случае конструкции
, сгенерированные при вызове nl2br( ), преобразуются в видимые символы.
get_html_translation_table()

Функция get_html_translation_table( ) обеспечивает удобные средства преобразования текста в эквиваленты HTML Синтаксис функции get_htrril_translation_table( ):

string get_html_translation_table (int таблица)

Функция get_html_translation_table( ) возвращает одну из двух таблиц преобразования (определяется параметром таблица), используемых в работе стандартных функций htmlspecialchars( ) и htmlentities( ). Возвращаемое значение может использоваться в сочетании с другой стандартной функцией, strtr(), для преобразования текста в код HTML.

Параметр таблица принимает одно из двух значений:

В следующем примере функция get_html_translation_table( ) используется при преобразовании текста в код HTML:

Кстати, функция array_flip( ) позволяет провести преобразование текста в HTML в обратном направлении и восстановить исходный текст. Предположим, что вместо вывода результата strtr( ) в предыдущем примере мы присвоили его переменной $translated string.

В следующем примере исходный текст восстанавливается функцией array_flip( ):

Функция strtr( ) транслирует строку, то есть заменяет в ней все символы, входящие в строку источник, соответствующими символами строки приемник. Синтаксис функции strtr( ):

string strtr (string строка, string источник, string приемник)

Если строки источник и приемник имеют разную длину, длинная строка усекается до размеров короткой строки.

Существует альтернативный синтаксис вызова strtr( ) с двумя параметрами; в этом случае второй параметр содержит ассоциативный массив, ключи которого соответствуют заменяемым подстрокам, а значения — заменяющим подстрокам. В следующем примере теги HTML заменяются XML-подобными конструкциями:

Преобразование HTML в простой текст

Иногда возникает необходимость преобразовать файл в формате HTML в простой текст. Функции, описанные ниже, помогут вам в решении этой задачи.
strip_tags()

Функция strip_tags( ) удаляет из строки все теги HTML и РНР, оставляя в ней только текст. Синтаксис функции strip_tags( ):

string strip_tags (string строка [, string разрешенные_тerи])

Необязательный параметр разрешенные_теги позволяет указать теги, которые должны пропускаться в процессе удаления.

Ниже приведен пример удаления из строки всех тегов HTML функцией strip_tags( ):

В следующем примере удаляются не все, а лишь некоторые теги:

Удаление тегов из текста также производится функцией fgetss().
get_meta_tags()

Хотя функция get_meta_tags( ) и не имеет прямого отношения к преобразованию текста, зто весьма полезная функция, о которой следует упомянуть. Синтаксис функции get_meta_tags( ):

array get_meta_tags (string имя_файла/URL [, int включение_пути])

Функция get_meta_tags( ) предназначена для поиска в файле HTML тегов МЕТА.

Теги МЕТА содержат информацию о странице, используемую главным образом поисковыми системами. Эти теги находятся внутри пары тегов . Применение тегов МЕТА продемонстрировано в следующем фрагменте (назовем его example.html, поскольку он будет использоваться в листинге 8.2):

Функция get_meta_tags( ) ищет в заголовке документа теги, начинающиеся словом МЕТА, и сохраняет имена тегов и их содержимое в ассоциативном массиве. В листинге 8.2 продемонстрировано применение этой функции к файлу example.html. Листинг 8.2. Извлечение тегов МЕТА из файла HTML функцией get_meta_tags( )

Интересная подробность: данные тегов МЕТА можно извлекать не только из файлов, находящихся на сервере, но и из других URL.
Преобразование строки к верхнему и нижнему регистру

В РНР существует четыре функции, предназначенных для изменения регистра строки:

strtolower();
strtoupper();
ucfirst();
ucwords().

Функция strtolower( ) преобразует все алфавитные символы строки к нижнему регистру. Синтаксис функции strtolower():

string strtolower(string строка)

Неалфавитные символы функцией не изменяются. Преобразование строки к нижнему регистру функцией strtolower() продемонстрировано в следующем примере:

Строки можно преобразовывать не только к нижнему, но и к верхнему регистру. Преобразование выполняется функцией strtoupper(), имеющей следующий синтаксис:

string strtoupper (string строка)

Неалфавитные символы функцией не изменяются. Преобразование строки к верхнему регистру функцией strtoupper() продемонстрировано в следующем примере:

Функция ucfirst( ) преобразует к верхнему регистру первый символ строки — при условии, что он является алфавитным символом. Синтаксис функции ucfirst():

string ucfirst (string строка)

Неалфавитные символы функцией не изменяются. Преобразование первого символа строки функцией ucfirst() продемонстрировано в следующем примере:

Функция ucwords( ) преобразует к верхнему регистру первую букву каждого слова в строке. Синтаксис функции ucwords():

string ucwords (string строка»)

Неалфавитные символы функцией не изменяются. «Слово» определяется как последовательность символов, отделенная от других элементов строки пробелами. В следующем примере продемонстрировано преобразование первых символов слов функцией ucwords( ):

strrchr(«строка», «о») — Находит последнее вхождение подстроки

Если подстрока не найдена, возвращает FALSE.

В отличие от strchr(), если искомая строка состоит более чем из одного символа, используется только первый символ.

Если второй параметр не является строкой, он приводится к целому и трактуется как код символа.

highlight_string()
highlight_string- выделение синтаксиса строки.

mixed highlight_string (string str [, bool return])

Функция highlight_string() выводит версию с расцвеченным синтаксисом строки str, используя цвета, определённые во встроенном выделении синтаксиса PHP.

Если второй параметр return имеет значение TRUE, то highlight_string() возвратит версию раскрашенного кода как строку, вместо её печати. Если второй параметр не имеет значение TRUE, highlight_string() возвратит TRUE при успехе, FALSE при неудаче.

Примечание: 1.параметр return стал доступен, начиная с PHP 4.2.0. До этого он работал, как по умолчанию, т.е. FALSE.
2.Функция Highlight_String() различает PHP код по тегам . show_source() — синоним highlight_file(). Для изменения цвета выделения по умолчанию используйте следующие PHP директивы:

addslashes()
— Экранирует спецсимволы в строке

Возвращает сроку, в которой перед каждым спецсимволом добавлен обратный слэш (\), например для последующего использования этой строки в запросе к базе данных.

Экранируются одиночная кавычка (‘), дойная кавычка («), обратный слэш (\) и NUL (байт NULL).

stripslashes
— Удаляет экранирование символов, произведенное функцией addslashes() Удаляет экранирующие бэкслэши. (\’ преобразуется в ‘, и т.д.). Двойные бэкслэши (\\) преобразуется в одиночные(\).
wordwrap()
Выполняет перенос строки на данное количество символов с использованием символа разрыва строки
\»;

> The first Matrix I
> designed was quite
> naturally
> perfect, it was a
> work of art —
> flawless, sublime.
> A triumph
> equalled only by
> its monumental
> failure. The
> inevitability
> of its doom is
> apparent to me now
> as a consequence
> of the
> imperfection
> inherent in every
> human being. Thus,
> I
> redesigned it
> based on your
> history to more
> accurately reflect
>
> the varying
> grotesqueries of
> your nature.
> However, I was
> again
> frustrated by
> failure.

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

  • 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? >

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

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

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

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

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

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

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

Помогите с использованием Strcmp() с двоичным файлом

У меня есть функция void display_a_student() , которая использует два двоичных файла. Сначала binary1.dat и index.dat, который содержит смещение каждого ученика, добавленного в binary1.dat.

Я пытаюсь использовать индекс, чтобы найти значение смещения для учащегося, которое вводится пользователем. У меня возникает проблема с использованием функции strcmp() для сравнения значения, введенного с этими значениями, содержащимися в index.dat файл.

Любая помощь будет высоко оценена здесь, код пока.

Я уверен линия: если (зЬгстр (studentNumSearch, FP1 [индекс] .studentNum) == 0) то, где я буду неправильно, как я уверен, как указать на файл в то время как с помощью strcmp(). — отредактированный код для актуальности.

Создан 31 мар. 11 2011-03-31 12:17:15 James

AFAIK fflush (stdin) — нестандартный. Некоторые компиляторы поддерживают его, но fflush (stdout) является вызовом этой функции, поддерживаемой стандартом. Вам, вероятно, придется сбросить входной буфер самостоятельно. – jonsca 31 мар. 11 2011-03-31 12:20:44

Я отформатировал ваш код — пожалуйста, используйте кнопку форматирования в редакторе или в следующий раз отложите весь свой код на 4 пробела. Кроме того, я бы рекомендовал удалить ваш образец кода до кратчайшего возможного фрагмента, который по-прежнему содержит соответствующие строки или демонстрирует вашу проблему. Чем дольше ваш код, тем меньше людей тратят время, чтобы его прочитать. – Péter Török 31 мар. 11 2011-03-31 12:22:14

Пожалуйста, сообщите нам (1), что вы ожидали от своего кода, (2) что он на самом деле сделал, и (3) почему вы думали, что это должно сделать # 1 вместо # 2. О, и (4) почему вы считаете, что проблема связана с линией, о которой вы упоминаете, и более конкретно с ‘strcmp’. – Gareth McCaughan 31 мар. 11 2011-03-31 12:26:31

Fp1 не является строго массивом, это указатель файла (в конце вашего кода) – jonsca 31 мар. 11 2011-03-31 12:29:15

Вы проверили, что «studentNumSearch» и «studentNum» из двоичного файла завершены с NULL? В противном случае strcmp будет продолжать сравнивать символы до тех пор, пока не будет отличаться (что, скорее всего, будет в двоичном файле). Вы также можете использовать ‘strncmp’, если знаете длину. – fnokke 31 мар. 11 2011-03-31 12:30:46

1: код должен запрашивать у пользователя ввод студентов, которых они хотят найти, используя их studentNum. Затем он использует файл index.dat, чтобы найти смещение (позицию) ученика в файле binary1.dat, а затем печатает из позиции binary1.dat на экран. 2: Он не будет компилироваться, поскольку кажется, что я не использую функцию strcmp() правильно, чтобы правильно указывать на индексный файл для сравнения. – James 31 мар. 11 2011-03-31 12:30:47

У вас есть неправильный взгляд на указатели FILE. Вы получаете доступ к нему в массиве strcmp as (и вы пытаетесь получить доступ к элементу поля, называемому studentNum. Это никогда не пройдет c-компилятор? Я рекомендую вам книгу/главу/веб-страницу/man-страницу о файлах ввода-вывода esp. О fopen , fread, fwrite, fscanf, fprintf, fclose. И если тогда все еще есть проблемы с strcmp, возможно, потому что ваши данные содержат 0, поэтому у вас есть, как уже указывал Бенуа в его ответе, вместо этого использовать memcmp. – flolo 31 мар. 11 2011-03-31 12:44:42

Strcmp — Сравнение строк, безопасное для данных в двоичной форме

strcmp
(PHP 3, PHP 4 , PHP 5)

strcmp — Сравнение строк, безопасное для данных в двоичной форме
Описание
int strcmp ( string str1, string str2)

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

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

Можешь использовать, взависимости от требований, следующие функции: strcmp() — Эта функция сравнивает две строки посимвольно (точнее, бобайтово); strncmp() — Синтаксис : int strncmp(string str1, string str2, int len) Эта функция отличается от strcmp() тем, что сравнивает не все слово целиком, а первые len байтов. strcasecmp() — Сравнивает строки без учета регистра. strncasecmp() — Сравнивает начала строк без учета регистра. strnatcmp() — Производит «естественное» сравнение строк. strnatcasecmp() — Производит «естественное» сравнение строк без учета регистра. similar_text() — Производит определение схожести двух строк. levenshtein() — Определение различия Левенштейна двух строк.

Если что, пиши на мыло или в Агент, подскажу подробней.

strcoll

(PHP 4 >= 4.0.5, PHP 5)

strcoll — Сравнение строк с учетом текущей локали

Описание

Обратите внимание, что эта функция учитывает регистр символов, и, в отличие от strcmp() не безопасна для обработки данных в двоичной форме.

strcoll() при сравнении использует установки текущей локали. Если установлена локаль C или POSIX, эта функция аналогична strcmp() .

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

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

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

Список изменений

Версия Описание
4.2.3 Теперь эта функция работает и на win32.

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

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

Помогите с использованием Strcmp() с двоичным файлом

У меня есть функция void display_a_student() , которая использует два двоичных файла. Сначала binary1.dat и index.dat, который содержит смещение каждого ученика, добавленного в binary1.dat.

Я пытаюсь использовать индекс, чтобы найти значение смещения для учащегося, которое вводится пользователем. У меня возникает проблема с использованием функции strcmp() для сравнения значения, введенного с этими значениями, содержащимися в index.dat файл.

Любая помощь будет высоко оценена здесь, код пока.

Я уверен линия: если (зЬгстр (studentNumSearch, FP1 [индекс] .studentNum) == 0) то, где я буду неправильно, как я уверен, как указать на файл в то время как с помощью strcmp(). — отредактированный код для актуальности.

Создан 31 мар. 11 2011-03-31 12:17:15 James

AFAIK fflush (stdin) — нестандартный. Некоторые компиляторы поддерживают его, но fflush (stdout) является вызовом этой функции, поддерживаемой стандартом. Вам, вероятно, придется сбросить входной буфер самостоятельно. – jonsca 31 мар. 11 2011-03-31 12:20:44

Я отформатировал ваш код — пожалуйста, используйте кнопку форматирования в редакторе или в следующий раз отложите весь свой код на 4 пробела. Кроме того, я бы рекомендовал удалить ваш образец кода до кратчайшего возможного фрагмента, который по-прежнему содержит соответствующие строки или демонстрирует вашу проблему. Чем дольше ваш код, тем меньше людей тратят время, чтобы его прочитать. – Péter Török 31 мар. 11 2011-03-31 12:22:14

Пожалуйста, сообщите нам (1), что вы ожидали от своего кода, (2) что он на самом деле сделал, и (3) почему вы думали, что это должно сделать # 1 вместо # 2. О, и (4) почему вы считаете, что проблема связана с линией, о которой вы упоминаете, и более конкретно с ‘strcmp’. – Gareth McCaughan 31 мар. 11 2011-03-31 12:26:31

Fp1 не является строго массивом, это указатель файла (в конце вашего кода) – jonsca 31 мар. 11 2011-03-31 12:29:15

Вы проверили, что «studentNumSearch» и «studentNum» из двоичного файла завершены с NULL? В противном случае strcmp будет продолжать сравнивать символы до тех пор, пока не будет отличаться (что, скорее всего, будет в двоичном файле). Вы также можете использовать ‘strncmp’, если знаете длину. – fnokke 31 мар. 11 2011-03-31 12:30:46

1: код должен запрашивать у пользователя ввод студентов, которых они хотят найти, используя их studentNum. Затем он использует файл index.dat, чтобы найти смещение (позицию) ученика в файле binary1.dat, а затем печатает из позиции binary1.dat на экран. 2: Он не будет компилироваться, поскольку кажется, что я не использую функцию strcmp() правильно, чтобы правильно указывать на индексный файл для сравнения. – James 31 мар. 11 2011-03-31 12:30:47

У вас есть неправильный взгляд на указатели FILE. Вы получаете доступ к нему в массиве strcmp as (и вы пытаетесь получить доступ к элементу поля, называемому studentNum. Это никогда не пройдет c-компилятор? Я рекомендую вам книгу/главу/веб-страницу/man-страницу о файлах ввода-вывода esp. О fopen , fread, fwrite, fscanf, fprintf, fclose. И если тогда все еще есть проблемы с strcmp, возможно, потому что ваши данные содержат 0, поэтому у вас есть, как уже указывал Бенуа в его ответе, вместо этого использовать memcmp. – flolo 31 мар. 11 2011-03-31 12:44:42

Является ли === в PHP двоично-безопасным в сравнении строк?

November 2020

1.2k раз

Php функция strcmp , strcasecmp и другая из этого семейства является бинарной безопасной.

Являются ли операторы == и === двоично-безопасным?

И если да, то, что должно быть использованы в двоичном безопасном сравнении строк: функции или оператор?

( Двоично-безопасный : «оператор или функция , которые могут быть применены к переменным , не изменяя их текущее состояние»)

2 ответы

Они, по вашему определению, но если вы сравниваете строки , содержащие двоичные данные, вы должны быть осведомлены о том , что в PHP $a == $b может вернуться так , даже если $ а и $ Ь различны. Пример: «2e2» == «200»

Все операторы сравнения являются бинарными безопасными и == и === (сравнивает с типом) являются операторами сравнения, чтобы они .

Илон Маск рекомендует:  Что такое код imap_setacl
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL