Pull to refresh

PREG: условные маски

Reading time1 min
Views615
Задача: есть на входе строка «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).
Tags:
Hubs:
Total votes 10: ↑8 and ↓2+6
Comments16

Articles