Я могу разделить строки в формате 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. }
Видеть это