парсинг данных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 |
да, забыл написать
цель получить с помощью match() массив. в котором каждая связка "ключ - значение" будет соответствовать тому или иному элементу в списке, всегда одному, например. arr[2]=='дрожжи' |
Не парсить html с помощью regexp - закон(который постоянно нарушают).
Гонишься за скоростью - конечный автомат те в помощь, иначе преобразование в dom и работа удобными методами. А так в один проход match на js не получится в любом случае. Нужно либо exec в в цикле, либо после match пройтись по всем результатам ещё раз. А регулярка примерно такая: https://regex101.com/r/RHDZg8/1 |
Цитата:
|
Цитата:
|
впрочем с последним разобрался, добавил пробел в регулярку
|
Часовой пояс GMT +3, время: 05:46. |