Функции Язык программирования PHP

substr

(PHP 3, PHP 4)

substr - возвращает часть строки.

Описание

string substr (string string, int start [, int length])

Substr возвращает часть строки string, специфицированную параметрами start и length.

Если start положительный, возвращаемая строка начинается со start'овой позиции в string, отсчитываемой от нуля. Например, в строке 'abcdef' символ в позиции 0 это 'a', символ в позиции 2 это 'c', и так далее.

Пример 1. Основы использования substr()
$rest 
= substr("abcdef", 1); // возвращает "bcdef" $rest = substr("abcdef", 1, 3); // 
возвращает "bcd" $rest = substr("abcdef", 0, 4); // возвращает "abcd" $rest = 
substr("abcdef", 0, 8); // возвращает "abcdef"

Если start отрицательный, возвращаемая строка начинается со start'ового символа, считая от конца строки string.

Пример 2. Использование отрицательного start
$rest = substr("abcdef", -1); // возвращает "f" $rest = substr("abcdef", 
-2); // возвращает "ef" $rest = substr("abcdef", -3, 1); // возвращает "d"

Если length задан и положительный, возвращаемая строка будет содержать максимум length символов, начиная со start (в зависимости от длины строки string. Если string меньше start, возвращается FALSE).

Если length задан и негативный, то это количество символов будет пропущено, начиная с конца string (после вычисления стартовой позиции, когда start негативный). Если start задаёт позицию за пределами этого усечения, возвращается пустая строка.

Пример 3. Использование негативного length
$rest = substr("abcdef", 0, -1); // возвращает "abcde" $rest = substr("abcdef", 
2, -1); // возвращает "cde" $rest = substr("abcdef", 4, -4); // возвращает "" 
$rest = substr("abcdef", -3, -1); // возвращает "de"

См. также strrchr() и ereg().


Назад Оглавление Вперёд
substr_replace Вверх trim

Рекурсивные патэрны

Рассмотрим проблему совпадения строки в скобках, когда допускается неограниченное вложение скобок. Без использования рекурсии лучшее, что можно сделать, это использовать патэрн, который совпадает на некоторую фиксированную глубину вложения. Невозможно обработать вложения на произвольно большую глубину. В Perl 5.6 имеется экспериментальная возможность, позволяющая (помимо прочего) выполнять рекурсию регулярных выражений. Специальный элемент (?R) предоставлен для этого специфического case/варианта рекурсии.
PCRE-патэрн разрешает проблему скобок (предполагая, что опция PCRE_EXTENDED установлена так, что пробел игнорируется):

\( ( (?>[^()]+) | (?R) )* \)

Вначале он совпадает с открывающей скобкой. Затем - с любым количеством подстрок, которые могут быть либо последовательностями не-скобок, либо рекурсивным совпадением самого патэрна (т.е. корректно заключённой в скобки подстрокой). Наконец, идёт закрывающая скобка.

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

(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()

то он быстро даст "нет совпадений". Однако, если однократный/once-only субпатэрн не используется, поиск совпадения будет продолжаться длительное время, так как есть много различных способов, которыми повторения + и * могут кроить строку-субъект, и все они должны быть проверены, прежде чем будет выдано сообщение о неудаче поиска.