Это то, что я делаю сейчас:
if (strpos($routeName,'/nl/') !== false) { $routeName = preg_replace('/nl/', $lang , $routeName, 1 ); }
Я заменяю nl
на ex. de
. Но теперь я хочу заменить second occurrence
. Какой самый простой способ сделать это?
Итак, сначала вы проверяете, есть ли какое-либо происшествие, и если да, вы его замените. Вы могли бы подсчитать происшествия ( unsing substr_count ) вместо этого, чтобы узнать, сколько из них существует. Затем просто замените их по частям, если это то, что вам нужно.
$occurances = substr_count($routeName, '/nl/'); if ($occurances > 0) { $routeName = preg_replace('/nl/', $lang , $routeName, 1 ); if ($occurances > 1) { // second replace $routeName = preg_replace('/nl/', $lang , $routeName, 1 ); } }
Если вы хотите заменить второе заполнение ( как указано вами позже в комментариях ), проверьте substr и прочитайте строковые функции в PHP. Вы можете использовать первое обнаружение, найденное с использованием strpos
в качестве начала для substr и просто использовать его для вашей замены.
<?php $routeName = 'http://example.nl/language/nl/peter-list/foo/bar?example=y23&source=nl'; $lang = 'de'; $routeNamePart1 = substr( $routeName, 0 , strpos($routeName,'nl') +4 ); $routeNamePart2 = substr( $routeName, strpos($routeName,'nl') + 4); $routeNamePart2 = preg_replace('/nl/', $lang , $routeNamePart2, 1 ); $routeName = $routeNamePart1 . $routeNamePart2; echo $routeName;
Смотрите, как это работает.
Вы можете сделать это:
$lang = 'de' $routeName = preg_replace('~/nl/.*?(?<=/)\Knl/~', "$lang/", $routeName, 1 );
\K
удалит все слева от результата результата. (Таким образом, все, что было сопоставлено слева с помощью /nl/.*?(?<=/)
, не будет заменено.)
Я использую lookbehind (?<=/)
Вместо литерала /
для работы с этим конкретным случаем /nl/nl/
(В этом случае .*?
Соответствует пустой подстроке.)