Intereting Posts
Является ли этот нежелательный ввод, от бота, заполняющего форму на моем веб-сайте, безопасным? PHP Сортировка массива по полю? PHP: «Глобальный» включить Предотвращение фиксации сеанса путем обеспечения единственного источника создания сеанса должно быть безопасным случайным генератором PHP переписывает включенный файл – это допустимый скрипт? php проверить, является ли переменная целой Создание индекса с помощью Elasticsearch 5.0 вызывает исключение Bad Request Codeigniter – Ограничение прямого доступа к функциям контроллера из вызова URL Doctrine Cache Symfony2 deleteByPrefix Как отправить переменную в php из javascript и вернуть результат обратно в JS PHP / ImageMagic Получить «тень» изображения php oop есть способ автоматически установить эти переменные Как отображать ошибки для моего MySQLi-запроса? Предупреждение: mysql_num_rows (): предоставленный аргумент не является допустимым ресурсом результата MySQL PHP-сокеты – полуработающие

preg_replace () заменить второе вхождение

Это то, что я делаю сейчас:

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/ (В этом случае .*? Соответствует пустой подстроке.)