2012-01-09 11 views
0

Мне нужно найти и заменить в строке, я хочу заменить последнее вхождение строки.regex заменить одно совпадение справа от строки

Вот мой рабочий код (который просто делает обычный поиск/замена):

PREG_REPLACE("/(\b{$abbr}\b)/i", "$long" , $street_address) 

Пример ожидаемых результатов:

  • $ street_address = "123 St Martin St"
  • $ abbr = "St"
  • $ long = "Улица"
  • возвращение = "123 St Martin Street"

Я хочу только последнее вхождение St заменено на Street.

ответ

2

Вы можете использовать отрицательное lokahead так:

$str = "123 St Martin St"; 
$abbr="(\b)St(\b)"; 
$long="Street"; 
var_dump(preg_replace("~$abbr(?!.*?$abbr)~", "$1" . $long . "$2", $str)); 

ВЫВОД:

string(20) "123 St Martin Street" 
+0

Это хорошо работало и позволяло использовать различные варианты сокращений. Благодарю. – lcdservices

+0

Добро пожаловать, рад, что это сработало для вас. – anubhava

1
PREG_REPLACE("/(.*(\b{$abbr}\b.*)*)\b{$abbr}\b/i", "$1$long" , $street_address) 

Это может быть относительно неэффективно.

+0

Это работает только, если строка имеет 'st' в нем, а также заканчивается с' st'. –

+0

Ракетка правильная - она ​​зависит от значения, присутствующего в другом месте строки. – lcdservices

+0

Я предназначил '(...)?' –

Смежные вопросы