PHP регулярное выражение соответствует последним вхождения сопоставления с образцом

0

Я знаю, что существует отрицательное регулярное выражение, которое может соответствовать последним вхождениям строки.

Пример: заменить последние строки строки

Я хочу сделать что-то подобное.

Пример:

$string = 'hello example (a) hello example (b) (c)';
echo preg_replace('/\(.*?\)(?!.*\(.*?\))/', '', $string);

Я пытаюсь заменить последние вхождения (. *), Но я потерпел неудачу. Результат, который я получил, - приветственный пример. Он заменяет весь первый (и последний), который является (a) примером hello (b) (c).

Мой ожидаемый пример - пример приветствия (a) привет (b).

Любой может дать какую-то подсказку? Какое правильное регулярное выражение для достижения того, что я хочу. Большое спасибо.

Теги:

2 ответа

2
Лучший ответ

Вы хотите использовать здесь отрицательный класс символов вместо .*? ,

.* Внутри вашего утверждения lookahead будет соответствовать вплоть до последнего появления (...) затем назад, последовательно сохраняя порядок наследования.

preg_replace('/\([^)]*\)(?!.*\([^)]*\))/', '', $string);

Чтобы упростить эту задачу, просто сохраните все до последнего появления.

preg_replace('/.*\K\(.*?\)/', '', $string);
  • 0
    Спасибо, работает отлично. Вы не возражаете, чтобы объяснить немного больше? Почему нужно использовать отрицательный символ? Как это работает в этом случае? Большое спасибо.
  • 0
    @hwnd - я пытался использовать его как этот preg_replace('/(?!\s+as\s+.*)/i', '', '(x as y) as z'); пытаясь избавиться от окончательного «как ...» (ожидаемый результат = ' (x as y)' - но это ничего не заменяет. Есть идеи, что не так?
0

Ошибка youre использует \(.*\) Она заменяет полную подстроку, которая начинается whith ( и заканчивается ). .* - максимальный квантификатор, (.*) - минимальный квантификатор.

Попробуй использовать:

$string = 'hello example (a) hello example (b) (c)'; echo preg_replace('/\((.*)\)$/', '', $string);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню