Общий подход для сопоставления всего текста с последним вхождением последующего шаблона (ов) - это использование жадной точки , .*
. Таким образом, вы можете сопоставить и захватить текст перед последним text
и заменить на обратную ссылку + новое значение:
$str = 'text abcd text text efgh';
echo preg_replace('~(.*)text~su', '${1}bar', $str);
// => text abcd text bar efgh
Если text
- это некоторое значение внутри переменной, которое должно рассматриваться как простой текст, используйте preg_quote
- , чтобы убедиться, что все специальные символы экранированы правильно :
preg_replace('~(.*)' . preg_quote($text, '~') . '~su', '${1}bar', $str)
См. онлайн-демо PHP и regex demo .
Здесь (.*)
совпадает, а захватывает в Группу 1 с любым нулем или более символами (обратите внимание, что модификатор s
также делает символы разрыва строки при точечном совпадении) как можно больше. до самого правого (последнего) вхождения text
. Если text
является подстрокой Unicode, модификатор u
пригодится в PHP (он позволяет глаголу (*UTF)
PCRE, позволяющему анализировать входящую строку как последовательность кодовых точек Unicode, а не байтов, и глаголу (*UCP)
, который делает все классы сокращенных символов с поддержкой Юникода - если таковые имеются).
${1}
является замещающей обратной ссылкой, заполнителем, содержащим значение, захваченное в Группу 1, которое позволяет восстановить эту подстроку в результирующей строке. Вы можете использовать $1
, но проблема может возникнуть, если $text
начинается с цифры .