#php #preg-replace
#php #preg-replace
Вопрос:
Почему preg_replace заменяет искомую строку только один раз в строке?
У меня есть строка «Привет —— Мир».
Я использую это
preg_replace( '#--#', '-', 'Hello------World');
Но preg_replace возвращает «Привет, мир». Таким образом, он заменяет первое появление и продолжает не проверять, есть ли еще какое-либо появление —
Как получить «Привет ——Мир» в «Привет-Мир»?
Комментарии:
1. 1 или более кванторов равно
и нет
-
, поэтому используйтеpreg_replace('/- /', '-', 'Hello------World');
Ответ №1:
То, что вы видите, является правильным поведением. Регулярное выражение сопоставляет два тире, заменяет их одним, затем выполняет поиск дальше. Снова находит два тире, заменяет их одним. Таким образом, шесть тире станут тремя тире.
Решением было бы сопоставить несколько тире, а затем заменить одним тире:
preg_replace( '#-- #', '-', 'Hello------World');
В регулярном выражении будет соответствовать хотя бы одному тире, но соответствует как можно большему количеству этих символов. Более конкретно, он сопоставляет все тире до тех пор, пока в строке не появится тире. Таким образом, теперь он найдет все шесть тире, заменит их одним тире и продолжит поиск, чтобы найти больше тире.
Ответ №2:
Я думаю, вам нужно добавить глобальный флаг в регулярное выражение, иначе он просто соответствует первому вхождению строки. например, preg_replace(‘#—#/g’, ‘-‘, ‘Привет ——Мир’); или что-то в этом роде
Комментарии:
1. @Joost я знаю 😉 Просто говорю, что в PHP нет модификатора g, поэтому это просто выдаст ошибку.