у меня есть строка
$s = '200x2000^3434^54545|120x400^3333^4444';
мне надо регулярной получить первую секцию между двух символов ^ ^
тестирую пока так:
echo preg_replace('/\^(.*?)\^/', 'XXXXX', $s);
но во первых оно захватывает и обе ^ и так же действует до конца строки
а мне надо что бы получилось так: 200x2000^XXXXX^54545|120x400^3333^4444
в гугле пишут что мне надо сделать символ * "не жадным а ленивым" но я всё не могу разобраться как это реализовать, подскажите пожалуйста
Используйте аргумент 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
- оператор, удаляющий весь текст из буфера текущего совпадения[^^]*
- ноль и более символов, отличных от ^
(?=\^)
- блок предварительного просмотра вперёд, который требует наличия символа ^
сразу после текущей позиции в строке.Заменить первое вхождение можно явно, добавив якорь начала строки:
$s = '200x2000^3434^54545|120x400^3333^4444';
echo preg_replace('#^([^^]*\^)(?:[^^]*)#', '${1}XXX', $s);
^([^^]*\^)
- От начала строки до первого символа ^, включая его(?:[^^]*)
- Некоторое количество не ^$1
- Подставить в замену первую группу захвата200x2000^XXX^54545|120x400^3333^4444
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Всем приветЯ для тренировки решил сделать справочный сайт со статьями
В моделях у меня находятся 2 модели (User и Song)Связь между моделями один ко многим
В ConfitureServices прописал servicesAddDbContext<ModelContext>();