Вывести структуру элементов в DOM-модели
Писал тут на php один парсер, получал html-код, а его парсил через domdocument.
Чтобы не запутаться, и всё было наглядно, написал себе функцию, которая выводит структуру в удобном виде.
Писал, кстати, за городом на ноуте, а когда нужно было что-то посмотреть: синтаксис или название какой-нибудь функции, различные варианты написания, то смотрел в интернете с телефона.
Вернёмся к функции. Она сырая, но работает как надо. Передаём ей один аргумент – $element типа DOMNode, чью структуру мы хотим получить. Возвращается html-код (просто текст с
для следующей строки и для отступов)
Если текст слишком длинный, он сокращается до 97 символов, если пробелы (пустой после trim), то «empty text». Перед каждым элементом пишется его порядковый номер в родительском элементе. В квадратных скобках атрибуты. Значение атрибута style сокращается, так как обычно оно достаточно длинное. Удачи.
function DOMreturnStructure($element, $Off="") { $s = ""; $cOff = $Off." "; if ($element->hasChildNodes()) { $children = $element->childNodes; $i = 0; foreach ($children as $child) { $s .= "$Off($i) "; if ($child->nodeName=="#text") { $s .= "#"; if (count($child->nodeValue)>=100) $s .= substr($child->nodeValue, 0, 97)."..."; else if (trim($child->nodeValue)=="") $s .= "empty text"; else $s .= $child->nodeValue; } else $s .= $child->nodeName; $attrs = $child->attributes; if ($attrs->length!=0) { $s .= " ["; foreach ($attrs as $attr) { if ($attr->nodeName=="style") $s .= $attr->nodeName."=<...>, "; else $s .= $attr->nodeName."=".$attr->nodeValue.", "; } $s .= "]"; } $s .= "<br/>"; $s .= DOMreturnStructure($child, $cOff); $i++; } } return $s; }
Действительно сыровато, но главное, что основное действие выполняет. Не понял правда немного с сокращением.
Понравилось, за исключением нескольких выражений, но это уде дело вкуса)
Немного не понял, переменная $element — это регулярное выражение или нет?
Могли бы вы для примера расписать, что передаёте переменной $element
(интересует синтаксис).
это DOMNode, не регулярка.
$doc = new DOMDocument(‘1.0’, ‘utf-8′);
$doc->encoding=’utf-8’;
$doc->recover = true;
$doc->strictErrorChecking = false;
@$doc->loadHTML(‘‘.$content);
$body = $doc->getElementsByTagName(«body»)->item(0);
echo DOMreturnStructure($body);
$s .= «$Off($i) «;
if ($child->nodeName==»#text») {
$s .= «#»;
if (count($child->nodeValue)>=100)
$s .= substr($child->nodeValue, 0, 97).»…»;
else
if (trim($child->nodeValue)==»»)
$s .= «empty text»;
else
$s .= $child->nodeValue;
Немного не понял этот момент
а всё разобрался сорри
А можно как нибудь по другому реализовать?
Там не много верстка слетела( И добавьте плз, какой нить редактор кода, а то читать не оч хорошо, а в остальном — спасибо за инфу…