Как поставить символ в конце выражения - PullRequest
1 голос
/ 10 апреля 2019

У меня есть это регулярное выражение

url\s*\((?:\'|"|)((\S*|\?)(?<!\'|\"))(?=\'\)|"\)|\))

Это хорошо работает для того, что я хочу в следующих случаях:

URL ( " .. / .. / Общие / общие / шрифты / Лато / Лато-черно-webfont.svg? # Lato_blackregular ")

Но когда у меня такая ситуация, она не работает так, как я хочу

lato_blackregular; ЦСИ: URL ( " .. / .. / Общие / общие / шрифты / Лато / Лато-черно-webfont.eot"); ЦСИ: URL (»../ .. /Common/common/fonts/lato/lato-black-webfont.eot?#iefix")

Как я могу определить ";" такие как разрыв строки, когда у вас есть ";" это для комбинации и начать все сначала?

Демонстрация происходящего: https://regex101.com/r/2YHl2C/1/

Использование \S*? не работает, потому что перестает корректно комбинироваться с background:url(/uploads/2019/03/0002-image(thumbnail_product).jpg)

Ответы [ 2 ]

2 голосов
/ 10 апреля 2019

Вы можете использовать

url\s*\(['"]?(.*?)['"]?\)(?![^;\s])

См. Демоверсию regex .

Шаблон будет соответствовать подстрокам, начинающимся с url(, тогда может быть дополнительный одиночныйили двойная кавычка, затем запишет в группу 1 ноль или более символов до первого ), за которым следует ; или пробел / конец строки.

См. график Regulex :

enter image description here

Подробности

  • url - url строка
  • \s* - 0+ пробельных символов
  • \( - ( char
  • ['"]? - 1 или 0 кавычек
  • (.*?)- Группа 1: любой ноль или более символов, кроме символов разрыва строки, как можно меньше
  • ['"]? - 1 или 0 кавычек
  • \) - ) char
  • (?![^;\s]) - должен быть ;, пробел или конец строки непосредственно справа от текущего местоположения.
1 голос
/ 10 апреля 2019

Пока у вас уже есть ответ, как насчет imo cleaner (рекурсивного) способа:

url
(\(
    (?P<url>(?:[^()]*|(?1))+)
\))

Для этого требуется только десятая часть шагов, необходимых для выражения @ Wiktor (~ 4000 против 400), см. ваше измененное демо на regex101.com .

...