Как заставить регулярное выражение возвращать только первое совпадение?

288
27 июля 2022, 18:10

у меня есть строка

$s = '200x2000^3434^54545|120x400^3333^4444';

мне надо регулярной получить первую секцию между двух символов ^ ^

тестирую пока так:

echo preg_replace('/\^(.*?)\^/', 'XXXXX', $s);

но во первых оно захватывает и обе ^ и так же действует до конца строки

а мне надо что бы получилось так: 200x2000^XXXXX^54545|120x400^3333^4444

в гугле пишут что мне надо сделать символ * "не жадным а ленивым" но я всё не могу разобраться как это реализовать, подскажите пожалуйста

Answer 1

Используйте аргумент limit со значением 1:

preg_replace('/\^[^^]*\^/', 'XXXXX', $str, 1) # Если нужно удалить символы ^
preg_replace('/(?<=\^)[^^]*(?=\^)/', 'XXXXX', $str, 1) # Если нужно сохранить символы ^ и заменить только текст внутри них

См. пример кода на PHP. См. справку по preg_replace:

limit Максимально возможное количество замен каждого шаблона для каждой строки subject. По умолчанию равно -1 (без ограничений).

См. пример работы регулярного выражения:

  • \^ - символ ^
  • [^^]* - ноль и более символов, отличных от ^
  • \^ - символ ^

Альтернативное решение

Если у вас нет возможности задать дополнительные аргументы для preg_replace, используйте

$str = preg_replace('/^[^^]*\^\K[^^]*(?=\^)/', 'XXXXX', $str);

См. пример этого регулярного выражения. Подробности:

  • ^ - начало строки
  • [^^]* - ноль и более символов, отличных от ^
  • \^ - символ ^
  • \K - оператор, удаляющий весь текст из буфера текущего совпадения
  • [^^]* - ноль и более символов, отличных от ^
  • (?=\^) - блок предварительного просмотра вперёд, который требует наличия символа ^ сразу после текущей позиции в строке.
Answer 2

Заменить первое вхождение можно явно, добавив якорь начала строки:

$s = '200x2000^3434^54545|120x400^3333^4444';
echo preg_replace('#^([^^]*\^)(?:[^^]*)#', '${1}XXX', $s);
  • ^([^^]*\^) - От начала строки до первого символа ^, включая его
  • (?:[^^]*) - Некоторое количество не ^
  • $1 - Подставить в замену первую группу захвата

200x2000^XXX^54545|120x400^3333^4444

READ ALSO
Создание стольких блоков сколько записей в БД

Создание стольких блоков сколько записей в БД

Всем приветЯ для тренировки решил сделать справочный сайт со статьями

279
Помогите отсортировать массив php

Помогите отсортировать массив php

Помогите пожалуйста с сортировкойЕсть примерно такой массив:

396
Проблема с базой данных и моделями в asp.net core mvc

Проблема с базой данных и моделями в asp.net core mvc

В моделях у меня находятся 2 модели (User и Song)Связь между моделями один ко многим

293
С# EF Core. Не срабатывает update-database

С# EF Core. Не срабатывает update-database

В ConfitureServices прописал servicesAddDbContext<ModelContext>();

269