PHP: Regex для игнорирования экранированных кавычек внутри кавычек

Они все действительно хороши, записаны академия , и (некоторые) книги (неопубликованная книга oreilly - переведенный из французского языка, но никакие проблемы я нашел), например). У меня есть *'d мои любимые, которые помогли мне больше всего.

ocaml:

  1. * Введение в ocaml
  2. Используя Понимают и распутывающий ocaml: практика к теории и наоборот
  3. * использование Приложений Разработки Ocaml - O'Reilly
  4. Объективная Система Caml - Официальное Руководство
  5. Краткое Введение в Объективный Caml
  6. Практический Ocaml

Haskell:

  1. Исследуют функциональное программирование с Haskell
  2. * реальный мир Haskell
  3. * Общее Функциональное программирование

28
задан Jonathan Leffler 24 October 2013 в 01:10
поделиться

2 ответа

Для большинства строк вам нужно разрешить экранированному все что угодно (не только экранированные кавычки). например вам, скорее всего, нужно разрешить экранированные символы, такие как "\n" и "\t" и, конечно, экранированный экранирование: "\\".

Это часто задаваемый вопрос, который был решен (и оптимизирован) давно. Джеффри Фридл подробно рассматривает этот вопрос (в качестве примера) в своей классической работе: Освоение регулярных выражений (3-е издание) . Вот регулярное выражение, которое вы ищете:

Хорошо:

"([^"\\]|\\.)*"
Версия 1: работает правильно, но не очень эффективно.

Лучше:

"([^"\\]++|\\.)*" или "((?>[^"\\]+)|\\.)*"
Версия 2: Более эффективно, если у вас есть собственнические квантификаторы или атомные группы (см .: правильный ответ греха, который использует метод атомной группы) .

Лучший:

"[^"\\]*(?:\\.[^"\\]*)*"
Версия 3: еще более эффективный. Реализует метод Фридля: «развернуть петлю» . Не требует притяжательных или атомарных групп (то есть это может использоваться в Javascript и других менее функциональных механизмах регулярных выражений.)

Вот рекомендуемые регулярные выражения в синтаксисе PHP как для двойных, так и для одинарных кавычек:

$re_dq = '/"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"/s';
$re_sq = "/'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'/s";
71
ответ дан 28 November 2019 в 02:31
поделиться

Это оставит кавычки за пределами

(?<=['"])(.*?)(?=["'])

и использование global / g будет соответствовать всем группам

0
ответ дан 28 November 2019 в 02:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: