Официальный сайт студ.городка НГТУ
Программирование и БД » [php] Regex или Как пропарсить HTML 

#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

#2  21.02.08 18:17

Re: [php] Regex или Как пропарсить HTML

парси HTML так же, как и XML

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

#4  21.02.08 20:09

Re: [php] Regex или Как пропарсить HTML

+1 к Jaguar'у

Offline

#5  21.02.08 20:30

Re: [php] Regex или Как пропарсить HTML

A-Lex, низкий поклон и большое спасибо :)
P.S.
[^>]* - это, как я понимаю, "всё, что угодно и сколько раз угодно, только не >"?

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} если символов нет или есть немного. или .+ если обязательно есть один или больше.

Приведенный пример тестовый, например для вложенной таблицы уже будут ошибки

Код: "HTML":

  [color=Red]<tr>
    <td> </td>
    <td> </td>
    <td><table width="200" border="1">
      <tr>
        <td> </td>
        </tr>[/color]
    </table></td>
  </tr>
  <tr>
    <td> </td>
    <td> </td>
    <td> </td>
  </tr>

Исправлено drug_detei (24.02.08 11:37)

Offline

Программирование и БД » [php] Regex или Как пропарсить HTML 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.095 сек.
Выполнено 14 запросов.