Intereting Posts

Регулярное выражение для запятой вне двойной цитаты в php

То, что я нашел до сих пор, это

preg_match_all("/'[^']+'|[^,]+/", $input, $output); 

Он должен найти запятые вне простых котировок, мне нужно адаптировать это к двойной кавычки.

Не уверен, что ваш оригинальный шаблон для одинарных кавычек верен, он найдет все запятые вне двойных кавычек:

 preg_match_all('~"(?:[^\\\"]+(?:\\\.)*|\\\.)*+"(*SKIP)(*F)|,~s', $subject, $matches); 

шаблон детали:

 ~ " (?: # all possible content between quotes [^\\\"]+ # all that is not a double quote or a backslash (?:\\\.)* # eventual escaped characters | # OR \\\. # an escaped character )*+ # repeat zero or more times (possessive) " # closing double quote, can be replaced with (?:"|\z) or "? (*SKIP)(*F) # forces the pattern to fail and to not retry double quoted parts | # OR , # a comma ~ s # allow the dot to match newlines characters 

Примечание: если вы хотите рассматривать подстроку после сиротской двойной кавычки в качестве цитируемой подстроки (до конца строки), вы можете заменить закрывающую двойную кавычку в шаблоне (?:"|\z) или более просто "?

Примечание2: чтобы резко сократить количество шагов, необходимых для поиска соответствия, шаблон можно переписать следующим образом:

 ~[^,"]*+\K(?:"[^"\\\]*+(?:(?:\\\.)+[^\\\"]*)*+"?|,(*ACCEPT)|\z(*COMMIT).)(*SKIP)(*F)~s 

или если вы хотите использовать технику распознавания первого символа:

 ~(?=[",])(?:"[^"\\\]*+(?:(?:\\\.)+[^\\\"]*)*+"?(*SKIP)(*F)|,)~s 

Чтобы соответствовать всем запятым, которые были вне одиночных кавычек и двойных кавычек.

 (?s)(?:(?<!\\)'(?:\\'|[^'])*'|(?<!\\)"(?:\\"|[^"])*")(*SKIP)(*F)|, 

DEMO