Я использую класс DOMDocument
для синтаксического анализа довольно непредсказуемой строки разметки. Это еще не все, что хорошо сформировано, и мне нужны некоторые данные. Разумеется, Regex - это все.
До сих пор, у меня есть это:echo innerHTML, без тегов внешнего узла
$dom = new DOMDocument;
$dom->loadHTML($str);
$contents = $dom->getElementsByTagName('body')->item(0);
echo $dom->saveXML($contents);
Теперь это дает мне:
<body>
<p>What I'm really after</p>
<ul><li>Foo</li><li>Bar</li></ul>
<h6>And so on</h6>
</body>
Что действительно раздражает меня те <body>
теги. Я хочу, чтобы они ушли. После выпаса паутины я наткнулся на самые странные обходные пути. Некоторые более Hacky, чем другие, так что в конце концов, я остановился на:
echo substr($dom->saveXML($contents), 6, -7);
все еще чувствует Hacky ко мне, но это лучшее, что я мог бы найти. Есть ли более надежный способ получения innerHTML DOM, начиная с данного узла, без фактических показов соответствующих тегов?
Я видел предложения с использованием регулярных выражений (А нет-нет IMHO), или даже Перебор всех детей, повторив те, которые имеют ChildNodes свои собственные, и нанизывание те, которые не делают:
if ($contents->hasChildNodes())
{
$children = $contents->getElementsByTagName('*');
foreach($children as $child)
{
if ($child->hasChildNodes() || $child->nodeName === 'br')
{//or isset($standaloneNodes[$child->nodeName])
echo $dom->saveXML($child);
continue;
}
echo '<'.$child->nodeName.'>'.$child->nodeValue.'</'.$child->nodeName.'>';
}
}
Но это для меня кажется еще более абсурдным ...
- тег '
' всегда присутствует? Вы хотите удалить ВСЕ теги? –@Harsh: тег '
' добавляется 'DOMDocument' (вместе с тегом doctype и тегом' '. Все, что я хочу сделать, это разобрать HTML-код, поэтому я могу получить некоторые бит данных, которые мне нужны, и верните нормализованную версию разметки –. Проверьте это: http://stackoverflow.com/questions/2087103/innerhtml-in-phps-domdocument –