Как заставить регулярное выражение возвращать только первое совпадение?
у меня есть строка
$s = '200x2000^3434^54545|120x400^3333^4444';
мне надо регулярной получить первую секцию между двух символов ^ ^
тестирую пока так:
echo preg_replace('/\^(.*?)\^/', 'XXXXX', $s);
но во первых оно захватывает и обе ^ и так же действует до конца строки
а мне надо что бы получилось так: 200x2000^XXXXX^54545|120x400^3333^4444
в гугле пишут что мне надо сделать символ * "не жадным а ленивым" но я всё не могу разобраться как это реализовать, подскажите пожалуйста
Ответы (3 шт):
Используйте аргумент 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
решил похожую задачу вот так (от начала строки дошел до первого нужного символа, после добавляется число а символ и все что до него удаляется с помощью \K): 