У меня есть список таких URL-адресов:

iphone-repair/iphone-4s-repair/iphone-4s-lcd-repair
iphone-repair/iphone-4s-repair/iphone-4s-glass-repair
iphone-repair/iphone-4s-repair/iphone-4s-glass-amp-lcd-replacement

Я хочу их так переписать:

iphone-repair/iphone-4s-repair/iphone-4s-screen-repair

У меня это работает так:

rewrite ^(.*?)-(glass|glass-.*?lcd|lcd)-.*?(replacement|repair)(.*?)  https://${server_name}$1-screen-repair$5 last;

Проблема в том, что есть и такие URL-адреса:

iphone-repair/iphone-4s-repair/iphone-4s-front-glass-amp-lcd-amp-back-glass-replacement

Мы НЕ хотим, чтобы какие-либо перезаписи происходили.

Итак, я бился головой о клавиатуру, пытаясь понять, как посмотреть назад, чтобы прервать ВЕСЬ совпадение, если появляется слово «впереди».

Я пробовал это

^(.*?)-(?<!front-)(glass|glass-.*?lcd|lcd)-.*?(replacement|repair)(.+)?

Но похоже, что это не прерывает весь матч ...

Любая помощь очень ценится !!

2
user12928 12 Сен 2018 в 00:07

1 ответ

Лучший ответ

Вы можете попробовать это

(?!.+-front) Negative Lookahead, утверждает, что URL не содержит front

^(?!.+-front)(.*?)-(glass|glass-.*?lcd|lcd)-.*?(replacement|repair)(.*?)

Попробуйте демо здесь

Пожалуйста, смотрите объяснение по ссылке.

3
The Scientific Method 12 Сен 2018 в 00:49
1
Спасибо!! Можете ли вы объяснить, что заставило его работать, что такого во вложенных группах захвата, которые устранили проблему? Кроме того, почему вы использовали отрицательный взгляд вперед вместо взгляда назад
 – 
user12928
12 Сен 2018 в 00:33
(?!.+-front) - это отрицательный просмотр вперед и проверяет, существовало ли front слово. я использую отрицательный просмотр вперед, потому что они поддерживают квантификаторы, а отрицательный просмотр вперед - нет.
 – 
The Scientific Method
12 Сен 2018 в 00:45