2013-05-30 5 views
1

Я использую класс 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.'>'; 
    } 
} 

Но это для меня кажется еще более абсурдным ...

+0

- тег '' всегда присутствует? Вы хотите удалить ВСЕ теги? –

+0

@Harsh: тег '' добавляется 'DOMDocument' (вместе с тегом doctype и тегом' '. Все, что я хочу сделать, это разобрать HTML-код, поэтому я могу получить некоторые бит данных, которые мне нужны, и верните нормализованную версию разметки –

+0

. Проверьте это: http://stackoverflow.com/questions/2087103/innerhtml-in-phps-domdocument –

ответ

1

При экспорте HTML вы должны иметь один корневой элемент. В большинстве случаев наиболее полезным является body. Поскольку вы загружаете фрагмент HTML, вы наверняка знаете, что у него не будет никаких атрибутов, поэтому substr(...,6,-7) идеально предсказуем и прекрасен.

+0

Спасибо за быстрый ответ. Он все еще чувствует себя немного взломанным ... во всяком случае: я закончил работу в течение дня, но я приму свой ответ, когда вернусь домой. –

+0

Да, это хаки, но хорошо работает. Хотя я бы боялся использовать это из-за его непрозрачной цели. : P –

+0

@Harsh: Вот почему все языки программирования, которые я когда-либо использовал, позволяют комментировать ... –

Смежные вопросы