Парсинг строки

sergey_privacy

Новичок
Есть у меня большое количество строк, которое надо распарсить на составные части. Не совсем понимаю, как лучше сделать. Строки вида:
A:Moscow, ul. Lenina 5 T:B O:Obuvnaya Fabrika
O:8736 T:F A:Saratov ul.Buhankina 9
O:Detskaya poliklinika 38 A:Nizhnie Perdunki T:NZMD

В каждой строке количество полей может меняться, поля могут быть с пробелами и без. Основное правило: поле начинается с большой буквы и двоеточия. Буква названия поля заранее не определена, со временем могут появляться еще. На выходе хочу получить массив типа:
[1] =>Array
(A=>Moscow, ul. Lenina 5 T=>B O=>Obuvnaya Fabrika)
[2] =>Array
(O=>8736 T=>F A=>Saratov ul.Buhankina 9)
[3] =>Array
(O=>Detskaya poliklinika 38 A=>Nizhnie Perdunki T=>NZMD)

Подскажите, как правильно это реализовать?
 

ksnk

прохожий
А что вызывает вопросы?
прочитать файл построчно?
используя регулярку '/\b([A-Z]):/', функцию preg_match_all и не забыв про флаг PREG_OFFSET_CAPTURE, получить разбиение строки на нужные кусочки?
вырезать интересные кусочки из строки?

Можно, конечно, навернуть регулярку посложнее, тогда вырезать из строки будет уже не нужно, но непонятная регулярка это как раз "теперь у вас 2 проблемы"
 

sergey_privacy

Новичок
А что вызывает вопросы?
используя регулярку '/\b([A-Z]):/', функцию preg_match_all и не забыв про флаг PREG_OFFSET_CAPTURE, получить разбиение строки на нужные кусочки?
Не получается нарезать именно так, как хочу. С помощью вашего выражения я получаю название ключа, с флагом я получаю еще позицию в строке.
Получается как то так:
PHP:
  [0] => Array
        (
            [0] => P:
            [1] => T:
            [2] => O:
        )
А должно получаться как то так:
PHP:
  [0] => Array
        (
           [A]=>Moscow, ul. Lenina 5
           [T]=>B
           [O]=>Obuvnaya Fabrika
        )
 

sergey_privacy

Новичок
Кроме названия ключей я получаю еще его позицию в строке. А мне вместо этого нужно значение.
 

sergey_privacy

Новичок
Вопрос не понял. Что значит "вырезать"? Удалить часть строки? Нет, ничего удалять не собираюсь. В условии задачи четко сказано: парсинг строки. Т.е. разбиение ее на логические части с занесением их в массив вида ключ-значение.
 

ksnk

прохожий
Тоесть, substr, получается, вызывает вопросы?
Если разобраться с этой функцией сложно - можно порекомендовать поразбираться в регулярках.
 

sergey_privacy

Новичок
Тоесть, substr, получается, вызывает вопросы?
Если разобраться с этой функцией сложно - можно порекомендовать поразбираться в регулярках.
Я задаю вопрос на форуме, т.к. после изучения подходящих команд сам не придумал алгоритм. Если вы знаете как ответить на мой вопрос, то ответьте. Пока что ваши высказывания похожи на обычный троллинг.
Команда substr возвращает часть подстроки с указанным смещением и указанное количество символов. Как она может помочь в моем вопросе я не представляю, т.к. количество слов и символов в каждом поле различное.
С регулярками, подходящими под мой случай разбираюсь уже неделю, но сам не нашел решения. Поэтому вопрос на форуме и возник. Вы знаете ответ, но что то или кто то мешает вам его озвучить или просто поговорить не с кем?
 

ksnk

прохожий
Кроме названия ключей я получаю еще его позицию в строке. А мне вместо этого нужно значение.
Команда substr возвращает часть подстроки с указанным смещением и указанное количество символов
Зная позицию начала ключа, зная его длину и зная позицию следующего ключа сложно ли вырезать значение?

Да, здесь не принято писать ответ на учебные задачи.
 

sergey_privacy

Новичок
Зная позицию начала ключа, зная его длину и зная позицию следующего ключа сложно ли вырезать значение?
Да, здесь не принято писать ответ на учебные задачи.
Если вы не знаете/не можете/не хотите написать ответ, то прошу вас больше не писать в этой теме.
 

AnrDaemon

Продвинутый новичок
Бедные люди.
Код:
(?:([A-Z])\:(.+?)\s*)+
 
Последнее редактирование модератором:

AnrDaemon

Продвинутый новичок
Попробуй включить голову. И наконец почитай про синтаксис регулярных выражений и поищи примеры.
 

sergey_privacy

Новичок
Попробуй включить голову. И наконец почитай про синтаксис регулярных выражений и поищи примеры.
Последние 10 дней только этим и занимаюсь. Есть полурабочие варианты, которые на некоторых сочетаниях дают сбой.
 

RU_ru

Новичок
PHP:
$s = [
 'A:Moscow, ul. Lenina 5 T:B O:Obuvnaya Fabrika'
,'O:8736 T:F A:Saratov ul.Buhankina 9'
,'O:Detskaya poliklinika 38 A:Nizhnie Perdunki T:NZMD'
];
foreach($s as $v) {
  preg_match_all('/([A-Z]):([^:]+)(?=[A-Z]:|$)/', $v, $m);
  echo '<pre>';
  print_r($m);
}
 
Сверху