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

substr_replace

(PHP 4)

substr_replace - заменяет текст части строки.

Описание

string substr_replace (string string, string replacement, int start [, int length])

substr_replace() замещает копию строки string, ограниченную параметрами start и (не обязательно) length - строкой, заданной в параметре replacement. Возвращает результат.

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

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

Если задан положительный length, он представляет длину замещаемой части строки string. Если он отрицательный, он представляет количество символов от конца строки string, с которых замещение останавливается. Если он не задан, то по умолчанию будет strlen( string ); т.е. конец замещения - в конце string.

Пример 1. substr_replace()
<?php $var = 'ABCDEFGH:/MNRPQR/'; echo "Original: $var<hr>\n"; 
/* Эти два примера замещают все $var на 'bob'. */ echo substr_replace($var, 'bob', 
0) . "<br>\n"; echo substr_replace($var, 'bob', 0, strlen($var)) . "<br>\n"; 
/* Вставляет 'bob' в начале $var. */ echo substr_replace($var, 'bob', 0, 0) . 
"<br>\n"; /* Следующие два замещают 'MNRPQR' в $var на 'bob'. */ echo 
substr_replace($var, 'bob', 10, -1) . "<br>\n"; echo substr_replace($var, 
'bob', -7, -1) . "<br>\n"; /* Удаляется 'MNRPQR' из $var. */ echo substr_replace($var, 
'', 10, -1) . "<br>\n"; ?>

См. также str_replace() и substr().


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

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

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

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

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

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

(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()

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