Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   парсинг данныхregexp'ом (https://javascript.ru/forum/misc/72075-parsing-dannykhregexp%27om.html)

Cache 06.01.2018 00:17

парсинг данных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

Cache 06.01.2018 00:22

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

Aetae 06.01.2018 00:29

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

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

Cache 06.01.2018 00:48

Цитата:

Сообщение от Aetae (Сообщение 474375)
иначе преобразование в dom и работа удобными методами.

там не к чему привязаться, на сайте остутствуют id объектов, т.е. по факту голый html, можно конечно в цикле перебирать, но как-то не уверен, что сильно упростит и ускорит задачу

Cache 06.01.2018 01:00

Цитата:

Сообщение от Aetae (Сообщение 474375)
А регулярка примерно такая: https://regex101.com/r/RHDZg8/1

для выражений из 2 слов, например "мясо свиное" не работает :(

Cache 06.01.2018 01:04

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


Часовой пояс GMT +3, время: 12:41.