Как правильно получить все элементы HTML внутри таблицы с помощью регулярных выражений в PHP?

Поэтому я использую regex101.com для проверки своей строки и не могу получить нужный вывод. Образец, который я сделал, можно посмотреть здесь https://regex101.com/r/YQTW4c/2.

Итак, мое регулярное выражение таково:

<table class=\"datatable\s\">(.*?)<\/table>

и образец строки:

<table class="datatable"><thead><tr><tr></thead></table>

Я хочу получить все данные внутри класса таблицы, которые в этом примере <thead><tr><tr></thead>,

Я что-то здесь упускаю? Любая помощь приветствуется.

0

Решение

Ваша проблема (как описано в regex101) заключается в том, что

"\s matches any whitespace character (equal to [\r\n\t\f\v ])"

Таким образом, вашему регулярному выражению требуется символ пробела между символом e в datatable и «, которого не существует. Если вы хотите разрешить ноль или более пробелов между этим символом e и», вам нужно изменить свое регулярное выражение на

<table class=\"datatable\s*\">(.*?)<\/table>

Обратите внимание, что экранирование «в регулярных выражениях не является необходимым (но я предполагаю, что они есть, потому что ваше регулярное выражение является строкой в ​​кавычках).

То, что другие говорили о неиспользовании регулярных выражений для разбора HTML, очень верно; например, это регулярное выражение завершится ошибкой, если вложены две таблицы с классом «datatable». Он также потерпит неудачу, если экземпляр данных будет создан с помощью дополнительных классов. Гораздо лучше использовать инструменты PHP, созданные для этой цели.

1

Другие решения

Очень, очень часто волонтеры призывают разработчиков использовать DomDocument, но очень, очень редко кто-нибудь на самом деле кодирует работающее решение. … поэтому я предложу решение, которое использует DomDocument и XPath.

Тег таблицы нацелен на использование его класса и item(0) это его первый ребенок. saveHTML() это то, как вы извлекаете данные.

Код: (демонстрация)

$html = <<<HTML
<table class="datatable"><thead><tr><tr></thead></table>
HTML;

$dom=new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$node = $xpath->evaluate("//table[contains(@class, 'datatable')]/*")->item(0);
echo $dom->saveHTML($node);

Выход:

<thead>
<tr></tr>
<tr></tr>
</thead>

* Обратите внимание, что выходной дом «исправлен» с включением закрытия </tr> теги.

1

По вопросам рекламы [email protected]