Задача: есть на входе строка «single param=true param2=»string fgfg"", необходимо разобрать на параметры.
upd: добавлен захват синглов; добавлены именованные захваты.
для решения пользуемся регуляркой
/(\w+)([=])?(?(2)([\"\'])?(?(3)(.*?)(?!\x5c)\3|([^\s]+)))/ms
регулярка с именованными захватами:
/(?P<lvalue>\w+)(?P<ref>[=])?(?(ref)(?P<quote>[\"\'])?(?(quote)(?P<multi>.*?)(?!\x5c)\3|(?P<signle>[^\s]+)))/ms
Важный момент: "([\"\'])?" мы ищем строку в кавычках или слово без них. Загвоздка в том, что в приведённом выражении нам надо либо получать backref #2 либо не получать, чтобы выражение "(?(2)" сработало. Если знак вопроса (?) поставить к списку символов "([\"\']?)", то обратная ссылка №2 будет всегда захватываться и условие "([^\s]+)" никогда не выполнится.
upd: В добавок хочу сказать, что в PHP мане не указано про именованные захваты "(?P<name>)", но они таки работают (по крайней мере в 5.2.4).
upd: добавлен захват синглов; добавлены именованные захваты.
для решения пользуемся регуляркой
/(\w+)([=])?(?(2)([\"\'])?(?(3)(.*?)(?!\x5c)\3|([^\s]+)))/ms
регулярка с именованными захватами:
/(?P<lvalue>\w+)(?P<ref>[=])?(?(ref)(?P<quote>[\"\'])?(?(quote)(?P<multi>.*?)(?!\x5c)\3|(?P<signle>[^\s]+)))/ms
Важный момент: "([\"\'])?" мы ищем строку в кавычках или слово без них. Загвоздка в том, что в приведённом выражении нам надо либо получать backref #2 либо не получать, чтобы выражение "(?(2)" сработало. Если знак вопроса (?) поставить к списку символов "([\"\']?)", то обратная ссылка №2 будет всегда захватываться и условие "([^\s]+)" никогда не выполнится.
upd: В добавок хочу сказать, что в PHP мане не указано про именованные захваты "(?P<name>)", но они таки работают (по крайней мере в 5.2.4).