Как получить data-атрибуты с дефисом через PHP Simple HTML DOM Parser
При парсинге HTML-документов с помощью библиотеки PHP Simple HTML DOM Parser разработчики часто сталкиваются с проблемой получения значений атрибутов, содержащих дефис, например data-price. Вместо ожидаемого числа возвращается 0. Разберём причины и способы решения.
Почему возникает ошибка при получении data-price
Библиотека PHP Simple HTML DOM Parser использует синтаксис, похожий на CSS-селекторы, где дефис интерпретируется как оператор вычитания. Поэтому при попытке получить $element->data-price парсер пытается выполнить арифметическую операцию, а не обратиться к атрибуту. Это приводит к возврату 0 или некорректного значения.
Способы получения значения data-атрибута
1. Использование метода getAttribute
Самый надёжный способ - явно вызвать метод getAttribute() для элемента. Он корректно обрабатывает атрибуты с любыми символами, включая дефис.
$html = str_get_html('6 287,86 р.');
$element = $html->find('span', 0);
$price = $element->getAttribute('data-price'); // вернёт "6287.86"2. Использование массива атрибутов
Можно обратиться к атрибуту через магический массив attr элемента. Это также позволяет получить значение без побочных эффектов.
$price = $element->attr['data-price']; // вернёт "6287.86"3. Применение регулярных выражений
Если по каким-то причинам предыдущие методы не работают, можно извлечь значение через регулярное выражение из исходного HTML.
preg_match('/data-price="([^"]+)"/', $html, $matches);
$price = $matches[1] ?? null;Дополнительные советы по парсингу
При работе с data-атрибутами в PHP Simple HTML DOM Parser всегда используйте getAttribute() или массив attr. Это предотвращает ошибки интерпретации. Также проверяйте, что элемент найден корректно, и обрабатывайте случай, когда атрибут отсутствует.
Заключение
Проблема получения значения атрибута data-price решается заменой прямого обращения через ->data-price на вызов getAttribute('data-price'). Это универсальное решение для любых атрибутов с дефисом. Используйте его в своих проектах для стабильного парсинга.