Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.223.32.230] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток.
В регулярными выражениями работать не приходилось. Подскажите, пожалуйста, выражение для распарсивания строки с параметрами. Подробнее: есть некие tpl-макросы, в шаблоне страницы они указываются в виде: %макрос(параметр1, параметр2, параметр3)%. Параметры макроса берутся как строка и парсятся по запятой. Но появилась такая проблема: если, например, параметр1 - это текст, содержащий запятую, то в этом случае, параметры парсятся неправильно. Заранее благодарю. |
Сообщ.
#2
,
|
|
|
Предположим, у нас есть строка, состоящая только из параметров (без имени макроса и скобок). Предположим, что параметры бывают двух типов:
- произвольная строка, обрамленная двойными кавычками ("); в строке могут быть одиночные символы (включая двойную кавычку), экранированные обратным слэшем (\); - любой набор символов, кроме запятой, начинающийся и заканчивающийся непробельным символом. Тогда перлосовместимый регвыр для параметра будет такой: /(?:(?:"(?:[^\\"]+|(?:\\.))*")|(?:[^,\s]+(?:\s+[^,\s]+)*))(?=\s*,|$)/ (При записи регвыра как строкового литерала нужно не забыть экранировать обратные слэши). Регвыр корректно работает с корректными списками параметров. При наличии ошибок в строке будут сюрпризы. Если регвыры не перлосовместимые, то работать вообще не будут. Чтобы решить обе проблемы, потребуется уже простейший синтаксический анализатор. |
Сообщ.
#3
,
|
|
|
AVA12, спасибо большое за ответ, но это немного не то.
Приведу более подробный пример. Пишем в коде макрос: %macro('звезда, хомяк', 0, 'текст')% Необходимо, чтобы сформировался следующий массив параметров: параметр1 = 'звезда, хомяк' параметр2 = 0 параметр3 = 'текст' Сейчас, при простом разделении параметров по запятой, получается такая картина: параметр1 = 'звезда' параметр2 = 'хомяк' параметр3 = 0 параметр4 = 'текст' |
Сообщ.
#4
,
|
|
|
Внеси нужные изменения в регвыр, который я привел. Для этого не нужно быть экспертом или даже профессионалом.
|
Сообщ.
#5
,
|
|
|
Удалось корректно разобрать параметры с помощью следующего кода:
$rx = "#\s*([^,\"']+|\"(?:[^\"]|\\\"|\"\")*?[^\"]\"|'(?:[^']|\\'|'')*?[^\']')\s*(?:,|$)#"; $out = array(); preg_match_all($rx, $args, $out); foreach ($out[1] as &$v) $v = str_replace(array('""', "''", '\"', "\'"), array('"', "'", '"', "'"), trim($v, '\'" ')); $args = (strlen($args) ? $out[1] : array()); |