Вывести структуру элементов в 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;
}

7 ответов к «Вывести структуру элементов в DOM-модели»

  1. Немного не понял, переменная $element — это регулярное выражение или нет?
    Могли бы вы для примера расписать, что передаёте переменной $element
    (интересует синтаксис).

    1. это 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);

  2. $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;
    Немного не понял этот момент

  3. Там не много верстка слетела( И добавьте плз, какой нить редактор кода, а то читать не оч хорошо, а в остальном — спасибо за инфу…

Добавить комментарий для dofin Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *