На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ALXR
  
    > RegExp для разбора списка параметров , через запятую
      Доброго времени суток.

      В регулярными выражениями работать не приходилось. Подскажите, пожалуйста, выражение для распарсивания строки с параметрами.

      Подробнее:
      есть некие tpl-макросы, в шаблоне страницы они указываются в виде: %макрос(параметр1, параметр2, параметр3)%. Параметры макроса берутся как строка и парсятся по запятой. Но появилась такая проблема: если, например, параметр1 - это текст, содержащий запятую, то в этом случае, параметры парсятся неправильно.

      Заранее благодарю.
        Предположим, у нас есть строка, состоящая только из параметров (без имени макроса и скобок). Предположим, что параметры бывают двух типов:
        - произвольная строка, обрамленная двойными кавычками ("); в строке могут быть одиночные символы (включая двойную кавычку), экранированные обратным слэшем (\);
        - любой набор символов, кроме запятой, начинающийся и заканчивающийся непробельным символом.
        Тогда перлосовместимый регвыр для параметра будет такой:
        /(?:(?:"(?:[^\\"]+|(?:\\.))*")|(?:[^,\s]+(?:\s+[^,\s]+)*))(?=\s*,|$)/
        (При записи регвыра как строкового литерала нужно не забыть экранировать обратные слэши).

        Регвыр корректно работает с корректными списками параметров. При наличии ошибок в строке будут сюрпризы. Если регвыры не перлосовместимые, то работать вообще не будут. Чтобы решить обе проблемы, потребуется уже простейший синтаксический анализатор.
          AVA12, спасибо большое за ответ, но это немного не то.

          Приведу более подробный пример. Пишем в коде макрос:
          %macro('звезда, хомяк', 0, 'текст')%

          Необходимо, чтобы сформировался следующий массив параметров:
          параметр1 = 'звезда, хомяк'
          параметр2 = 0
          параметр3 = 'текст'

          Сейчас, при простом разделении параметров по запятой, получается такая картина:
          параметр1 = 'звезда'
          параметр2 = 'хомяк'
          параметр3 = 0
          параметр4 = 'текст'
            Внеси нужные изменения в регвыр, который я привел. Для этого не нужно быть экспертом или даже профессионалом.
              Удалось корректно разобрать параметры с помощью следующего кода:
              ExpandedWrap disabled
                $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());
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0266 ]   [ 15 queries used ]   [ Generated: 28.04.24, 06:51 GMT ]