Записывая свой комментарий к вашему вопросу, я подумал: «Определенно, должно быть другое решение, не включающее какое-либо регулярное выражение, которое станет невозможно поддерживать» ...
Может быть, я нашел способ; взгляните на
Инструкция первых гласит (цитирование):
В отличие от загрузки XML, HTML не имеет
быть в хорошей форме, чтобы загрузить.
А в руководстве второго написано:
Создает HTML-документ из DOM
представление.
Попытка тех, кто предоставил недействительную HTML-строку, дает следующий пример:
$str = <<<STRING
<tr>
<th class="ProfileIndent0">
<p>Global pharmaceuticals</p>
<td>197.2</td>
<td>94</td>
</tr>
STRING;
$doc = new DOMDocument();
$doc->loadHTML($str);
echo $doc->saveHTML();
И при запуске (из командной строки, чтобы избежать проблем с выходом из HTML для правильного отображения) , я получаю:
$ php ./temp.php
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><tr>
<th class="ProfileIndent0">
<p>Global pharmaceuticals</p>
</th>
<td>197.2</td>
<td>94</td>
</tr></body></html>
Который, переформатированный, дает:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<body>
<tr>
<th class="ProfileIndent0">
<p>Global pharmaceuticals</p>
</th>
<td>197.2</td>
<td>94</td>
</tr>
</body>
</html>
Пока не идеально, я допускаю (например, он не добавил никаких тегов <table>
) , но, по крайней мере, теги теперь закрыты как следует ...
Возможны проблемы с тегами DOCTYPE
и <html>
; Вы, возможно, не хотите, чтобы те ... Взгляните на некоторые комментарии на странице руководства: они могут помочь вам; -)
РЕДАКТИРОВАТЬ после немного больше мысли:
Ваш "полный" пример генерирует некоторые предупреждения; может быть, вы можете немного привести в порядок свой «HTML», прежде чем вводить loadHTML
...
Warning: DOMDocument::loadHTML(): Tag co_text invalid in Entity,
line: 1 in /home/squale/developpement/tests/temp/temp.php on line 18
Warning: DOMDocument::loadHTML(): Tag text_data invalid in Entity,
line: 2 in /home/squale/developpement/tests/temp/temp.php on line 18
Warning: DOMDocument::loadHTML(): htmlParseStartTag: invalid element name in Entity,
line: 2 in /home/squale/developpement/tests/temp/temp.php on line 18
Warning: DOMDocument::loadHTML(): Unexpected end tag : table in Entity,
line: 10 in /home/squale/developpement/tests/temp/temp.php on line 18
В худшем случае вы можете замаскировать эти ошибки либо с помощью функции error_reporting
до и после вызова функции, либо с помощью оператора @ ...
Однако я бы вообще не рекомендовал их: использовать их следует в крайних случаях - возможно, это ^^
Тем не менее, на самом деле результат выглядит неплохо:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<body>
<co_text text_type_id="6">
<text_data>
<tr>
<th class="TableHead" colspan="21">2008 Sales</th>
</tr>
<tr>
<th class="ProfileIndent0"></th>
<th class="ProfileHead">$ mil.</th>
<th class="ProfileHead">% of total</th>
</tr>
<tr>
<th class="ProfileIndent0"> <p>Global pharmaceuticals</p> </th>
<td>197.2</td>
<td>94</td>
</tr>
<tr>
<th class="ProfileIndent0">Impax pharmaceuticals</th>
<td>12.9</td>
<td>6</td>
</tr>
<tr>
<th class="ProfileTotal">Total</th>
<td class="ProfileDataTotal">210.1</td>
<td class="ProfileDataTotal">100</td>
</tr>
<h3>Selected Generic Products</h3>
<ul class="prodoplist">
<li>Anagrelide hydrochloride (generic Agrylin, thrombocytosis)</li>
<li>Bupropion hydr ochloride (generic Wellbutrin SR, depression)</li>
<li>Colestipol hydrochloride (generic Colestid, high cholesterol)</li>
<li>Dantrolene sodium (generic Dantrium, spasticity)</li>
<li>Metformin Hcl (generic Glucophage XR, diabetes)</li>
<li>Nadolol/Bendroflumethiazide (generic Corzide, hypertension)</li>
<li>Oxybutynin chloride (generic Ditropan XL, urinary incontinence, with Teva)</li>
<li>Oxycodone hydrochloride (generic OxyContin controlled release, pain)</li>
<li>Pilocarpine hydrochlorine (generic Salagen, dry mouth caused by radiation therapy)</li>
</ul>
]]>
</text_data>
</co_text>
</body>
</html>
В заключение, как уже предлагали другие, может помочь настоящий HTML-инструмент / очиститель; -)