#1 21.02.08 16:03
[php] Regex или Как пропарсить HTML
Ребят, может кто сталкивался - помогите :)
Задача с следующем - есть html документ, в котором содержится табличка с данными. Эти данные нужно занести в БД. Формат таблички строго не оговорён, но заранее известен.
Покурив Гугл и не найдя более-менее подходящего готового решения, прикинул, что проще всего было бы сделать это при помощи regex'ов. Всё было бы хорошо, однако regex'ы я пишу немногим лучше, чем танцую балет :(
К примеру берём следующий html код:
Код::
<tr style="font-weight: normal; font-size: 7pt;">
<td style="border-left:1pt solid black; border-bottom:1pt solid black;">22.10.2007</td>
<td style="border-bottom:1pt solid black;">11:07:36</td>
<td style="border-bottom:1pt solid black;" align="left"><--0001300</td>
<td style="border-bottom:1pt solid black;" align="left"></td>
<td style="border-bottom:1pt solid black;" align="left"></td>
<td style="border-bottom:1pt solid black;" align="left">sms i</td>
<td style="border-bottom:1pt solid black;"></td>
<td style="border-bottom:1pt solid black;" align="right">1</td>
<td style="border-bottom:1pt solid black;" align="right"> 0.0000</td>
<td style="border-bottom:1pt solid black; border-right:1pt solid black;" align="right"> 0.0000</td>
</tr>
<tr style="font-weight: normal; font-size: 7pt;">
<td>22.10.2007</td>
<td>11:07:39</td>
<td align="left"><--0001300</td>
<td align="left"></td>
<td align="left"></td>
<td align="left">sms i</td>
<td></td>
<td align="right">1</td>
<td align="right"> 0.0000</td>
<td align="right"> 0.0000</td>
</tr>Здесь представлены два экземпляра одной сущности. Как может выглядеть regex, которым можно будет вычленить атрибуты в массив? На сколько я понимаю, это должно быть что-то вроде: /<tr.*>[*<td.*>()</td>*]{10}</tr>/ или я глубоко неправ?
Offline
#3 21.02.08 19:33
Re: [php] Regex или Как пропарсить HTML
efferson, специально для твоего кода :)
Код: php:
$regTr = "#<tr[^>]*>(.*)</tr>#ismU"; $regTd = "#<td[^>]*>(.*)</td>#ismU"; $text = ' <tr style="font-weight: normal; font-size: 7pt;"> <td style="border-left:1pt solid black; border-bottom:1pt solid black;">22.10.2007</td> <td style="border-bottom:1pt solid black;">11:07:36</td> <td style="border-bottom:1pt solid black;" align="left"><--0001300</td> <td style="border-bottom:1pt solid black;" align="left"></td> <td style="border-bottom:1pt solid black;" align="left"></td> <td style="border-bottom:1pt solid black;" align="left">sms i</td> <td style="border-bottom:1pt solid black;"></td> <td style="border-bottom:1pt solid black;" align="right">1</td> <td style="border-bottom:1pt solid black;" align="right"> 0.0000</td> <td style="border-bottom:1pt solid black; border-right:1pt solid black;" align="right"> 0.0000</td> </tr> <tr style="font-weight: normal; font-size: 7pt;"> <td>22.10.2007</td> <td>11:07:39</td> <td align="left"><--0001300</td> <td align="left"></td> <td align="left"></td> <td align="left">sms i</td> <td></td> <td align="right">1</td> <td align="right"> 0.0000</td> <td align="right"> 0.0000</td> </tr>'; preg_match_all($regTr, $text, $out, PREG_PATTERN_ORDER); foreach ($out[1] as $td) { preg_match_all($regTd, $td, $outTd, PREG_PATTERN_ORDER); $result[] = $outTd[1]; } var_dump($result);
Offline
#6 21.02.08 22:28
Re: [php] Regex или Как пропарсить HTML
A-Lex написал(а):
Код::
$regTd = "#<td[^>]*>(.*)</td>#ismU";
как старый перловый наркоман не могу не поинтересоваться:
если использован инвертор жадности квантификатора, что позволяет работать конструкции "(.*)", например, то зачем используется класс-исключение "[^>]"?
в данном случае конструкция "<td.*>" должна работать правильно, т.к. в этом случае * - не жадный
Offline
#7 24.02.08 11:31
Re: [php] Regex или Как пропарсить HTML
Matrim написал(а):
что позволяет работать конструкции "(.*)", например, то зачем используется класс-исключение "[^>]"?
для очевидности наверно. конструкции .* потенциально опасные (либо все либо ничего). лучше .{0,100} если символов нет или есть немного. или .+ если обязательно есть один или больше.
Приведенный пример тестовый, например для вложенной таблицы уже будут ошибки
Исправлено drug_detei (24.02.08 11:37)
Offline

