Как я могу получить данные из исходного кода HTML с помощью PHP и RegEx?

У меня есть исходный код 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> < br /> ...
...
<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? Что еще я могу сделать?

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


person Maozturk    schedule 26.01.2011    source источник
comment
Вы пытались использовать DOM? Вы можете подавить ошибки, используя @, и даже если он неправильно сформирован, он все равно работает.   -  person Jake N    schedule 27.01.2011


Ответы (3)


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

person Richard H    schedule 26.01.2011
comment
+1 - Я добавил PHP Tidy в свой ответ, когда вспомнил, что TagSoup на Java (и этот вопрос на PHP), но вы сначала сказали об этом в своем ответе. - person Richard JP Le Guen; 27.01.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 не является обычным языком.

person webbiedave    schedule 27.01.2011
comment
Как вы сказали, я думаю, что регулярное выражение бесполезно для этого. Неправильно сформированный html-документ может быть обработан Tidy и DOM или только SimpleHTMLDom. - person Maozturk; 09.02.2011

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

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

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

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

person Richard JP Le Guen    schedule 26.01.2011
comment
Хорошо, TagSoup и Tidy установлены на сервере по умолчанию? - person Maozturk; 27.01.2011
comment
Я не под впечатлением как таковой; на самом деле TagSoup - это инструмент Java (мой плохой!), хотя tidy, по-видимому, поставляется с PHP - person Richard JP Le Guen; 27.01.2011
comment
Неправильно сформированный html-документ может быть преобразован в правильно сформированный html с помощью Tidy, а затем может использоваться DOMDocument. Спасибо за все. - person Maozturk; 09.02.2011