@chifth

PHP. preg_match_all как сделать вложенный парсинг?

Приветствую. В РНР я новичок. Осваююсь. Хочу сделать парсер текста с записью в БД по условиям. С принцыпом работы функции разобрался, но никак не могу продвинуться дальше вот где:

ВВОДНАЯ ИНФО:
Есть следующий текст: (ввод сделал POST c TEXTAREA )

Yanitic:ачив не найдено

yurahm: медаль золото(23:10 12-12-2014)
59д Жертвам Голодомору(T2617, Voronovytsya, Chernivets' ka oblast, Ukraine) https://www.ingress.com/intel?ll=48.530544,26.64706&z=17&pll=48.530544,26.64706
59д Памятник Неизвестного Солдату (Unnamed Road, Sokil, Khmel' nyts' ka oblast, Ukraine) https://www.ingress.com/intel?ll=48.529953,26.645298&z=17&pll=48.529953,26.645298
58д Капличка(Unnamed Road, Ruda, Khmel' nyts' ka oblast, Ukraine) https://www.ingress.com/intel?ll=48.555892,26.567197&z=17&pll=48.555892,26.567197
39д Олень(E50, Vinnyts' ka oblast, Ukraine) https://www.ingress.com/intel?ll=49.366811,27.984859&z=17&pll=49.366811,27.984859
39д Сержант Петренко(E50, Vinnyts' ka oblast, Ukraine) https://www.ingress.com/intel?ll=49.366651,27.985773&z=17&pll=49.366651,27.985773
32д Собор Святого Михаїла(Olimpiiska St, Khmelnytskyi, Khmel' nyts' ka oblast, Ukraine) https://www.ingress.com/intel?ll=49.435902,26.958889&z=17&pll=49.435902,26.958889
15д Стадиончик(Lyali Ratushnoi Street, 128, Vinnytsia, Vinnyts' ka oblast, Ukraine) https://www.ingress.com/intel?ll=49.221695,28.433667&z=17&pll=49.221695,28.433667

zZHunteRZz:ачив не найдено

zZWehrZz:ачив не найдено
GhostPathfinder: медаль золото(03:19 19-02-2016)
54д памятник Володарскому(Н03, Khmel' nyts' ka oblast, Ukraine) https://www.ingress.com/intel?ll=49.806018,27.56081&z=17&pll=49.806018,27.56081
54д церковь(Н03, Khmel' nyts' ka oblast, Ukraine) https://www.ingress.com/intel?ll=49.806456,27.561546&z=17&pll=49.806456,27.561546
54д Павшим В Боях(Н03, Krasnoselka, Zhytomyrs' ka oblast, Ukraine) https://www.ingress.com/intel?ll=49.989098,28.000007&z=17&pll=49.989098,28.000007
54д Часовня на перекрёстке(E101, Chernihivs' ka oblast, Ukraine) https://www.ingress.com/intel?ll=51.139195,31.862377&z=17&pll=51.139195,31.862377
54д Прокопович Петр Иванович(E101, Chernihivs' ka oblast, Ukraine) https://www.ingress.com/intel?ll=51.298025,32.770144&z=17&pll=51.298025,32.770144

1д Filarmoniya(Haharina street, 5, Khmelnytskyi, Khmel' nyts' ka oblast, Ukraine) https://www.ingress.com/intel?ll=49.418876,26.976199&z=17&pll=49.418876,26.976199


Это список Игроков и захваченных ими порталов с координатами (ссылка на карту).
Надо чтобы скрипт арсил и записывал в базу всю перечисленную инфо, но столкнулся с проблемой: Имя игрока пишется только один раз и ниже список порталов. Построчным парсингом я могу(умею) вывести (и сделать что-либо) только с теми у кого одна строчка: нет ачив.
А как сделать чтобы те, у кого список большой, добавлялись в БД с указанием никнейма? Построчно добавить могу, но без никнейма.
Пробовал вложенные инструкции делать, но не выходит.
Подскажите, как указать функции что если строчка с никнеймом и инфо о медали - то парсить следующие строчки вплоть до следующого никнейма (или второго сброса строки, он как отступ в тексте), или по окончанию строчки "4цыфры и пустая следующая строка". Пробовал s, \z, \Z, m (^ и $ставил в выражениях) но не выходит.
Помогите пожалуйста.

Вот скрипт
76e464a8420349b1a7fdc695167a0860.PNG
  • Вопрос задан
  • 423 просмотра
Пригласить эксперта
Ответы на вопрос 2
MrAbdrahimov
@MrAbdrahimov
Web-разработчик
Я бы поизвращался так:
Построчно искал наличие "https://www.ingress.com/intel" в строке.
В случае если не найдено, то с этой строки парсим ачиву с датой или "ачив не найдено"
со всех последующих строк в которых найдено "https://www.ingress.com/intel" мы Забираем в БД список порталов присвоенных последнему найденному пользователю.

for($i=0;$i<count($list);$i++){
      if(stristr($list[$i], 'https://www.ingress.com/intel') === FALSE) {
            $login = 'парсим логин с $list[$i] и присваеваем';
      } else {
            $port = 'парсим данные портала и прочее с $list[$i]';
      }
      Кладём в БД $login $port;
}


Таким образом мы перелопатим все строки и положим всю инфу в БД. Нужно тольно $list[] почистить от пустых значений или фильтровать.
p.s. $list[] - список строк принятого текста.
Ответ написан
Комментировать
ravshanium
@ravshanium
аналитик, веб-программист
Вроде не сложно получилось:
https://regex101.com/r/272lAq/1
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы