Работа со строками
Nette\Utils\Strings статический класс, содержащий полезные функции для работы со строками, в основном в кодировке UTF-8.
Установка:
Во всех примерах предполагается, что псевдоним уже создан:
С учетом регистра
Для этих функций требуется расширение PHP mbstring
.
lower (string $s): string
Преобразует строку UTF-8 в строчный регистр.
upper (string $s): string
Преобразует строку UTF-8 в верхний регистр.
firstUpper (string $s): string
Преобразует первую букву строки UTF-8 в верхний регистр, остальные не изменяет.
firstLower (string $s): string
Преобразует первую букву строки UTF-8 в строчную, остальные не изменяет.
capitalize (string $s): string
Преобразует первую букву каждого слова в строке UTF-8 в верхний регистр, остальные – в нижний.
Редактировать строку
normalize (string $s): string
Удаляет управляющие символы, нормализует переносы строк до \n
,
обрезает ведущие и отстающие пустые строки, обрезает правые переносы
строк, нормализует UTF-8 до нормальной формы NFC.
unixNewLines (string $s): string
Преобразует переносы строк в \n
, используемые в системах Unix.
Разрывы строк: \n
, \r
, \r\n
, U+2028 разделитель строк,
U+2029 разделитель абзацев.
platformNewLines (string $s): string
Преобразует переводы строк в символы, характерные для текущей
платформы, т.е. \r\n
в Windows и \n
в другом месте. Разрывы строк:
\n
, \r
, \r\n
, U+2028 разделитель строк, U+2029 разделитель
абзацев.
webalize (string $s, ?string $charlist=null, bool $lower=true): string
Изменяет строку UTF-8 до формата, используемого в URL, т.е. удаляет диакритические знаки и заменяет все символы, кроме букв английского алфавита и цифр, на дефис.
Если необходимо сохранить другие символы, их можно указать во втором параметре функции.
Третий параметр можно использовать для подавления преобразования в нижний регистр.
Требуется расширение PHP intl
.
trim (string $s, ?string $charlist=null): string
Обрезает пробелы (или другие символы, указанные вторым параметром) из начала и конца строки UTF-8.
truncate (string $s, int $maxLen,
string $append=`'…'
`): string
Усекает строку UTF-8 до указанной максимальной длины, стараясь сохранить целые слова. Если строка усеченная, то в конец добавляется триплет (можно изменить с помощью третьего параметра).
indent (string $s, int $level=1, string
$indentationChar=`"\t"
`): string
Отступ многострочного текста слева. Количество отступов определяется вторым параметром, который используется для отступов третьего параметра (значение по умолчанию – tab).
padLeft (string $s, int $length, string
$pad=`' '
`): string
Завершает строку UTF-8 до указанной длины, повторяя строку
$pad
слева.
padRight (string $s, int $length,
string $pad=`' '
`): string
Завершает строку UTF-8 до указанной длины, повторяя строку $pad
справа.
substring (string $s, int $start, ?int $length=null): string
Возвращает часть строки UTF-8 $s
, заданную начальной позицией
$start
и длиной $length
. Если $start
отрицательный, то
возвращаемая строка будет начинаться с символа -$start
символа
с конца.
reverse (string $s): string
Изменяет строку UTF-8.
length (string $s): int
Возвращает количество символов (не байтов) в строке UTF-8.
Это количество кодовых точек Unicode, которое может отличаться от количества графем.
compare (string $left, string $right, ?int $length=null): bool
Сравнение двух строк UTF-8 или частей строк без учета регистра. Если
$length
содержит null, то сравниваются целые строки, если
отрицательно, то сравнивается соответствующее количество символов с
конца строк, иначе сравнивается соответствующее количество символов с
начала.
findPrefix (…$strings): string
Находит общее начало строк. Или возвращает пустую строку, если общий префикс не найден.
before (string $haystack, string $needle, int $nth=1): ?string
Возвращает часть строки $haystack
перед n-м $nth
вхождением
строки $needle
. Или null
, если $needle
не был найден. Если
$nth
отрицательный, то поиск ведется с конца строки.
after (string $haystack, string $needle, int $nth=1): ?string
Возвращает часть строки $haystack
после n-го $nth
вхождения
строки $needle
. Или null
, если $needle
не был найден. Если
$nth
отрицательный, то поиск ведется с конца строки.
indexOf (string $haystack, string $needle, int $nth=1): ?int
Возвращает позицию в символах n-го $nth
вхождения строки
$needle
в строку $haystack
. Или null
, если $needle
не был
найден. Если $nth
отрицательный, то поиск ведется с конца
строки.
Кодирование
fixEncoding (string $s): string
Удаляет из строки недопустимые символы UTF-8.
toAscii (string $s): string
Преобразует строку UTF-8 в ASCII, т.е. удаляет диакритические знаки и т.д.
Требуется расширение PHP intl
.
chr (int $code): string
Возвращает определенный символ UTF-8 из кодовой точки (число в диапазоне 0×0000…D7FF и 0xE000…10FFFF).
ord (string $char): int
Возвращает кодовую точку UTF-8 определенного символа (число в диапазоне 0×0000…D7FF или 0xE000…10FFFF).
Регулярные выражения
Класс Strings предоставляет функции для работы с регулярными
выражениями. В отличие от собственных функций PHP, они имеют более
понятный API, лучшую поддержку Unicode и, что самое важное, обнаружение
ошибок. Любая ошибка при компиляции или обработке выражения приведет к
возникновению исключения Nette\RegexpException
.
split (string $subject, string $pattern, bool $captureOffset=false, bool $skipEmpty=false, int $limit=-1, bool $utf8=false): array
Разделяет строку на массив в соответствии с регулярным выражением. Выражения в круглых скобках также будут перехвачены и возвращены.
Если $skipEmpty
равен true
, то будут возвращены только
непустые записи:
Если $limit
, то будут возвращены только подстроки до предела, а
остальная часть строки будет помещена в последний элемент. Предел –1
или 0 означает отсутствие предела.
Если $utf8
равно true
, то оценка переключится в режим Unicode.
Это аналогично указанию модификатора u
.
Если $captureOffset
равен true
, то для каждого встречающегося
совпадения будет возвращена его позиция в строке (в байтах; в символах,
если установлен $utf8
). Это изменяет возвращаемое значение на
массив, каждый элемент которого представляет собой пару, состоящую из
совпадающей строки и ее позиции.
match (string $subject, string $pattern, bool $captureOffset=false, int $offset=0, bool $unmatchedAsNull=false, bool $utf8=false): ?array
Ищет в строке часть, соответствующую регулярному выражению, и
возвращает массив с найденным выражением и каждым подвыражением, или
null
.
Если $unmatchedAsNull
равен true
, то не захваченные подвыражения
возвращаются как нулевые; в противном случае они возвращаются как
пустая строка или не возвращаются:
Если $utf8
равно true
, то оценка переключается в режим Unicode.
Аналогично указанию модификатора u
:
Параметр $offset
может использоваться для указания позиции, с
которой следует начинать поиск (в байтах; в символах, если установлен
$utf8
).
Если $captureOffset
равен true
, то для каждого встречающегося
совпадения будет также возвращена его позиция в строке (в байтах; если
установлен $utf8
, то в символах). Это превращает возвращаемое
значение в массив, каждый элемент которого представляет собой пару,
состоящую из совпадающей строки и ее смещения:
matchAll (string $subject, string $pattern, bool $captureOffset=false, int $offset=0, bool $unmatchedAsNull=false, bool $patternOrder=false, bool $utf8=false, bool $lazy=false): array|Generator
Ищет в строке все вхождения, соответствующие регулярному выражению, и возвращает массив массивов, содержащих найденное выражение и каждое подвыражение.
Если $patternOrder
равен true
, то структура результатов
изменяется таким образом, что первая запись представляет собой массив
полных совпадений шаблона, вторая – массив строк, совпадающих с
первым подшаблоном в круглых скобках, и так далее:
Если $unmatchedAsNull
равен true
, то несовпадающие подшаблоны
возвращаются как нулевые; в противном случае они возвращаются как
пустые строки или не возвращаются:
Если $utf8
равно true
, то оценка переключается в режим Unicode.
Аналогично указанию модификатора u
:
Параметр $offset
может использоваться для указания позиции, с
которой следует начинать поиск (в байтах; в символах, если установлен
$utf8
).
Если $captureOffset
равен true
, то для каждого встречающегося
совпадения будет также возвращена его позиция в строке (в байтах; если
установлен $utf8
, то в символах). Это изменяет возвращаемое
значение на массив, каждый элемент которого представляет собой пару,
состоящую из совпадающей строки и ее позиции:
Если $lazy
равно true
, то вместо массива функция возвращает
Generator
, что дает значительный выигрыш в производительности при
работе с большими строками. Генератор позволяет находить совпадения
постепенно, а не обрабатывать всю строку сразу. Это позволяет
эффективно работать с очень большими входными текстами. Кроме того, вы
можете прервать обработку в любой момент, если нашли нужное
совпадение, что экономит вычислительное время.
replace (string $subject, string|array
$pattern, string|callable $replacement=''
, int $limit=-1, bool $captureOffset=false, bool
$unmatchedAsNull=false, bool $utf8=false): string
Заменяет все вхождения, соответствующие регулярному выражению.
$replacement
– это либо маска строки замены, либо обратный вызов.
Функция также допускает множественную замену, передавая во втором
параметре массив вида pattern => replacement
:
Параметр $limit
ограничивает количество замен, которые могут
быть сделаны. Предел –1 означает отсутствие предела.
Если $utf8
равно true
, то оценка переключается в режим Unicode.
Это аналогично указанию модификатора u
.
Если $captureOffset
равен true
, то для каждого встречающегося
совпадения его позиция в строке (в байтах; в символах, если установлен
$utf8
) также будет передана обратному вызову. Это изменяет форму
передаваемого массива, где каждый элемент представляет собой пару,
состоящую из совпадающей строки и ее позиции.
Если $unmatchedAsNull
– true
, то несовпадающие подшаблоны
передаются в обратный вызов как null; в противном случае они передаются
как пустая строка или не передаются: