Как получить 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'). Это универсальное решение для любых атрибутов с дефисом. Используйте его в своих проектах для стабильного парсинга.

    Часто задаваемые вопросы