Регулярное выражение PHP: разделение на неэкранированный разделитель

Я могу разделить строки в формате format key:value; используя следующий код:

 $inside = "key1:value1;key2:value2;key3:value3;"; preg_match_all("/([^:]+):([^;]+);/s", $inside, $pairs); 

То, что я хотел бы сделать, это разрешить появление символов двоеточия и полуколонии в значениях, введя escape-символ, например \; любая двоеточие или точка с двоеточием, которым предшествует обратная косая черта, будет проигнорирована.

Бонусные точки, если внутри одного и того же регулярного выражения, экранированные символы затем могут быть сохранены в массиве совпадений без сохранения без необходимости запускать все через str_replace . Спасибо за любую помощь, которую вы можете предложить.

 preg_match_all( '/( # Match and capture... (?: # either: \\\\. # an escaped character | # or: [^\\\\:] # any character except : or \ )+ # one or more times ) # End of capturing group 1 : # Match a colon ((?:\\\\.|[^\\\\;])+); # Same for 2nd part with semicolons /x', $inside, $pairs); 

Является ли это. Однако он не удаляет обратную косую черту. Вы не можете сделать это в самом регулярном выражении; для этого вам понадобится функция обратного вызова.

Чтобы соответствовать финальному элементу, даже если он не заканчивается изменением разделителя ; to (?:;|$) (то же самое для : . И вернуть пустые элементы, а также изменить + на a * .

Ты можешь сделать:

 $inside = "key\:1:value\;1;key2:value2;key3:value3;"; $pairs = preg_split('/(?<!\\\\);/',$inside,-1,PREG_SPLIT_NO_EMPTY ); foreach($pairs as $pair) { list($k,$v) = preg_split('/(?<!\\\\):/',$pair); // $k and $v have the key and value respectively. } 

Видеть это