у меня есть строка
$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
Сборка персонального компьютера от Artline: умный выбор для современных пользователей