Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.01.2018, 00:17
Кандидат Javascript-наук
Отправить личное сообщение для Cache Посмотреть профиль Найти все сообщения от Cache
 
Регистрация: 02.05.2013
Сообщений: 111

парсинг данныхregexp'ом
Доброго времени суток.
Пытаюсь парсить данные из таблицы, но уже голову сломал как это сделать быстро и менее затратно по ресурсам.
Задачка, есть, к примеру куча div'ов содержащих талбицы:
<div><table>...</table></div>

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

постоянные:
ккал
углеводы
жирность

<div id=""><table width=300 cellpadding=2 cellspacing=0><tr><th style=text-align:center;>Название</th></tr>Бtr><td>мука: 40% <br />яйцо: 50% <br />соль: 10% <br /></td></tr><tr><th style=text-align:center;></th></tr><tr><td><hr />ккал: 100 <br /></td><td><hr />углеводы: 100 <br /></td><td><hr />жирность: 100 <br /></td></tr></table></div>


Сейчас, я беру каждый div и парсю его по наличию в нем тех или иных элементов по отдельности, как-то так:
/сыр (\d+)/i


пробовал парсить сразу все одним выражением, но получаю интересный эффект, берется первое найденное выражение из необязательных, и потом все обязательные, все что между - пропускается.
Регулярка:
/<td>.*?(?:мука: (\d+))?.*?(?:дрожжи: (\d+))?.*?(?:яйцо: (\d+))?.*?(?:сыр: (\d+))?.*?(?:мясо говяжье: (\d+))?.*?(?:мясо свиное: (\d+))?.*?(?:рыба: (\d+))?.*?(?:лук: (\d+))?.*?(?:соль: (\d+))?.*?(?:перец: (\d+))?.*?ккал: (\d+).*?углеводы: (\d+).*?жирность: (\d+).*?
/i

Помогите исправить или возможно изменить вообще принцип сбора данных, если оба способа, совсем уж "кривые".

https://regex101.com/r/zORcAQ/1
Ответить с цитированием
  #2 (permalink)  
Старый 06.01.2018, 00:22
Кандидат Javascript-наук
Отправить личное сообщение для Cache Посмотреть профиль Найти все сообщения от Cache
 
Регистрация: 02.05.2013
Сообщений: 111

да, забыл написать
цель получить с помощью match() массив. в котором каждая связка "ключ - значение" будет соответствовать тому или иному элементу в списке, всегда одному, например. arr[2]=='дрожжи'

Последний раз редактировалось Cache, 06.01.2018 в 00:43.
Ответить с цитированием
  #3 (permalink)  
Старый 06.01.2018, 00:29
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

Не парсить html с помощью regexp - закон(который постоянно нарушают).
Гонишься за скоростью - конечный автомат те в помощь, иначе преобразование в dom и работа удобными методами.

А так в один проход match на js не получится в любом случае. Нужно либо exec в в цикле, либо после match пройтись по всем результатам ещё раз.
А регулярка примерно такая: https://regex101.com/r/RHDZg8/1
__________________
29375, 35

Последний раз редактировалось Aetae, 06.01.2018 в 00:38.
Ответить с цитированием
  #4 (permalink)  
Старый 06.01.2018, 00:48
Кандидат Javascript-наук
Отправить личное сообщение для Cache Посмотреть профиль Найти все сообщения от Cache
 
Регистрация: 02.05.2013
Сообщений: 111

Сообщение от Aetae Посмотреть сообщение
иначе преобразование в dom и работа удобными методами.
там не к чему привязаться, на сайте остутствуют id объектов, т.е. по факту голый html, можно конечно в цикле перебирать, но как-то не уверен, что сильно упростит и ускорит задачу
Ответить с цитированием
  #5 (permalink)  
Старый 06.01.2018, 01:00
Кандидат Javascript-наук
Отправить личное сообщение для Cache Посмотреть профиль Найти все сообщения от Cache
 
Регистрация: 02.05.2013
Сообщений: 111

Сообщение от Aetae Посмотреть сообщение
А регулярка примерно такая: https://regex101.com/r/RHDZg8/1
для выражений из 2 слов, например "мясо свиное" не работает
Ответить с цитированием
  #6 (permalink)  
Старый 06.01.2018, 01:04
Кандидат Javascript-наук
Отправить личное сообщение для Cache Посмотреть профиль Найти все сообщения от Cache
 
Регистрация: 02.05.2013
Сообщений: 111

впрочем с последним разобрался, добавил пробел в регулярку
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсинг информации admiral Javascript под браузер 3 02.11.2016 15:18
Парсинг json с двойными кавычками llpoolerll jQuery 9 29.06.2016 17:28
Парсинг чата aHuxley Общие вопросы Javascript 9 02.04.2014 21:02
Парсинг даты Allan Stark Общие вопросы Javascript 4 30.01.2014 18:57
Парсинг страницы с авторизацией aspx karmis Серверные языки и технологии 0 21.02.2012 18:28