Поэтому я использую 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>
,
Я что-то здесь упускаю? Любая помощь приветствуется.
Ваша проблема (как описано в regex101) заключается в том, что
"\s matches any whitespace character (equal to [\r\n\t\f\v ])"
Таким образом, вашему регулярному выражению требуется символ пробела между символом e в datatable и «, которого не существует. Если вы хотите разрешить ноль или более пробелов между этим символом e и», вам нужно изменить свое регулярное выражение на
<table class=\"datatable\s*\">(.*?)<\/table>
Обратите внимание, что экранирование «в регулярных выражениях не является необходимым (но я предполагаю, что они есть, потому что ваше регулярное выражение является строкой в кавычках).
То, что другие говорили о неиспользовании регулярных выражений для разбора HTML, очень верно; например, это регулярное выражение завершится ошибкой, если вложены две таблицы с классом «datatable». Он также потерпит неудачу, если экземпляр данных будет создан с помощью дополнительных классов. Гораздо лучше использовать инструменты PHP, созданные для этой цели.
Очень, очень часто волонтеры призывают разработчиков использовать 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>
теги.