Как я могу получить данные из исходного кода HTML с помощью PHP и RegEx? - PullRequest
1 голос
/ 27 января 2011

У меня есть исходный код HTML, и я должен получить некоторый информационный текст в HTML. Я не могу использовать DOM, потому что документ не правильно сформирован.

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

Я получаю источник с помощью curl, и я буду редактировать его с помощью функции preg_match_all и регулярных выражений.

Источник:
...
<TR Class="Head1">
<TD width="15%"><font size="12">Name</font></TD>
<TD>:&nbsp;</TD>
<TD align="center"><font color="red">Alex</font></TD>
<TD width="25%"><b>Job</b></TD>
<TD>:&nbsp;</B></TD>
<TD align="center" width="25%"><font color="red">Doctor</font></TD>
</TR>
...
...
<TR Class="Head2">
<TD width="15%" align="left">Age</B></TD>
<TD>:&nbsp;</TD>
<TD align="center"><font color="red">32</font></TD>
<TD width="15%"><font size="10">data</TD></font>
<TD>&nbsp;</B></TD>
<TD width="40%">&nbsp;</TD>
</TR>
...

Как мы видели, источник плохо сформирован. На самом деле, ужасно! Но я ничего не могу сделать. Источник длиннее этого.

Как я могу получить данные из источника? Я могу удалить все HTML-коды, но как узнать последовательность данных? Что я могу сделать с preg_match_all и regex? Что еще я могу сделать?

Я жду вашей помощи.

Ответы [ 4 ]

2 голосов
/ 27 января 2011

Если вы можете использовать DOM, это намного лучше, чем регулярные выражения.Взгляните на PHP Tidy - он предназначен для управления плохо сформированным HTML.

1 голос
/ 27 января 2011

Вы можете использовать DOMDocument для загрузки плохо сформированного HTML:

$doc = new DOMDocument();
@$doc->loadHTML('<TR Class="Head2">
<TD width="15%" align="left">Age</B></TD>
<TD>:&nbsp;</TD>
<TD align="center"><font color="red">32</font></TD>
<TD width="15%"><font size="10">data</TD></font>
<TD>&nbsp;</B></TD>
<TD width="40%">&nbsp;</TD>
</TR>');


$tds = @$doc->getElementsByTagName('td');
foreach ($tds as $td) {
 echo $td->textContent, "\n";
}

Я подавляю предупреждения в приведенном выше коде для краткости.

Вывод:

Age
: 
32
data
  <!-- space -->
  <!-- space -->

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

0 голосов
/ 27 января 2011
$regex = <<<EOF
<TR Class="Head2">\s+<TD width="15%" align="left">Age</B></TD>\s+<TD>:&nbsp;</TD>\s+<TD align="center"><font color="red">(\d+)</font></TD>\s+<TD width="15%"><font size="10">(\w+)</TD></font>\s+<TD>&nbsp;</B></TD>\s+<TD width="40%">&nbsp;</TD>\s+</TR>
EOF;

preg_match_all($regex, $text, $result);

var_dump($result)
0 голосов
/ 27 января 2011

Не используйте RegEx. Ссылка забавная, но не информативная, поэтому в общем и целом, разметка HTML не является обычным языком, поэтому ее нельзя анализировать просто с помощью регулярных выражений.

Вы можете использовать RegEx для разбора отдельных «токенов» (один открытый тег; одно имя или значение атрибута ...) как часть алгоритма рекурсивного анализа, но вы не можете использовать магический RegEx для анализа всего HTML на его владеть.

Или вы можете использовать парсер.

Поскольку разметка недействительна, возможно, вы могли бы использовать TagSoup или PHP: Tidy .

...