Парсинг строки регулярным выражением

Sancho

Новичок
Парсинг строки регулярным выражением

Имеется строка вида "a=b c=d...", где a,c... являются целыми числами, а b,d... могут представлять из себя как число/слово без пробелов, так и заключенную в двойные кавычки фразу. в которой слова разделены пробелами. Типичный пример: "1=15 2=type 3="Какое-то устройство"". Зараннее количество таких пар неизвестно. Необходимо распарсить строку так, чтобы на выходе получить массив вида $array[0]="a=b", $array[1]="c=d" и так далее.
 

Sancho

Новичок
Скажем так, эта строка - список параметров. Если не вдаваться в подробности, то я запрашиваю некоторый сервер на предмет параметров устройств, и он мне выдает их в такой форме, где первая часть каждого выражения - id параметра, а вторая - его значение.
 

vovik

Новичок
Сдается мне, что затрахаешся ты регулярное выражение писать для такой строки. И даже ФАК тут вряд ли поможет :)

Можно попробовать сделать так:
1. Меняем все пробелы внутри кавычек на что-нибудь:
PHP:
$string = preg_replace('/"(.*?)"/e', "str_replace(' ', '<space>', '\\1')", $string);
Заодно избавляемся от кавычек.

2. Делаем explode по пробелу
3. Для каждого элемента меняем <space> обратно на пробел


Вариант не идеален, конечно, но один из возможных.
 

Sancho

Новичок
Согласен, вот уже целое утро и бьюсь:) Была такая идея. В принципе, для такой строки и ручками не так сложно парсер написать, без регулярных выражений. Ладно, не сложилось здесь, наверное, с регулярными выражениями, если и напишу - по ходу, ресурсов могут немерено жрать, так что будем решать как-то по-другому:) Ладно, пошел решать, всем спасибо за участие и советы:)
 

Фанат

oncle terrible
Команда форума
В принципе, для такой строки и ручками не так сложно парсер написать, без регулярных выражений
вот я тоже как раз собирался написаь, что пперебирая посимвольно получится быстрее и проще всего

кавычки-то чем твой сервер экранирует внутри строк?
 

vovik

Новичок
Вот еще вариант - передвинуть открывающую кавычку
PHP:
$string = preg_replace('/([0-9])="/', '"\\1=', $string);
А потом скормить это дело fgetcsv()
 

Sancho

Новичок
to Фанат: кавычки внутри строк не экранируются, а кавычки внутри кавычек экранируются обратным слэшем

to vovik: спасибо:) Но мне кажется, легче по-человечески распарсить ручками, чем так извращаться:)
 

vovik

Новичок
Лично я все же бы придумал как это сделать без посимвольного парсинга - как раз проще и веселее.

Только учти, если что, мои варианты - это не готовый код для копи-пасте а направления, в которых думать :)
 

Sancho

Новичок
Да я понял, я и не стремлюсь почти никогда к тому, чтобы мне давали готовые варианты:) Спасибо за участие:)
 

ksnk

прохожий
Я такой вот штукой
PHP:
   while(preg_match('/([^\s>=]+|>)(?:="([^\"]+)"|=\'([^\']+)\'|=([^\s>]+)|)/si',$s,
                           $mm,PREG_OFFSET_CAPTURE,$pos_first) )
   {
            $pos_first=$mm[0][1]+strlen($mm[0][0]);
            if ($mm[1][0]==">") {$from=$mm[1][1]+1; break;}
            if     (isset($mm[2][0])&&($mm[2][0]!=="")) {$prm=$mm[2][0];$quotes='"';}
            elseif (isset($mm[3][0])&&($mm[3][0]!=="")) {$prm=$mm[3][0];$quotes="'";}
            elseif (isset($mm[4][0])&&($mm[4][0]!=="")) {$prm=$mm[4][0];$quotes= "";}
            else {$prm=FALSE;$quotes= '"';}
            $prt=$mm[1][0];
  ...
   }
из строки $s выедаю параметры тега HTML. Вроде, пока работает :)
Здесь, как я понял, примерно то-же самое....
 
Сверху