2011-01-24 13 views
5

Próbuję parsować fragment kodu HTML za pomocą funkcji DOM DOMU. Usunąłem wszystko poza tagami akapitu, zakresu i linii podziału, a teraz chcę odzyskać cały tekst wraz z towarzyszącymi mu stylami.Jak mogę znaleźć węzły tekstowe we fragmencie HTML?

Chciałbym otrzymać każdy fragment tekstu, jeden po drugim, a za każdy z nich mogę wrócić do drzewa, aby uzyskać wartości poszczególnych atrybutów (interesują mnie tylko niektóre z nich) , jak kolor itp.).

Jak mogę to zrobić? Czy też myślę o tym w niewłaściwy sposób?

Dzięki!

+0

Kod może być dowolny (dobrze, w granicach rozsądku). Pochodzi z TinyMCE, a następnie usuwam wszystko poza rozpiętościami i akapitami. – Sharon

+0

proszę pokazać kod * PHP DOM *, którego używasz na wejściu * pochodzącym z TinyMCE * – Gordon

+0

Obecnie nic nie robię - nie zaszły jeszcze tak daleko! Próbuję ustalić, od czego zacząć! – Sharon

Odpowiedz

9

Załóżmy, że masz domDocument tutaj:

$doc = new DOMDocument(); 
$doc->loadHTMLFile('http://stackoverflow.com/'); 

można znaleźć wszystkie węzły tekstowe za pomocą prostego XPath.

$xpath = new DOMXpath($doc); 
$textNodes = $xpath->query('//text()'); 

Wystarczy foreach nad nim iteracyjne nad wszystkie textnodes:

foreach ($textNodes as $textNode) { 
    echo $textNode->data . "\n"; 
} 

tym, można przejść w górę drzewa DOM za pomocą ->parentNode.

Mam nadzieję, że może to dać dobry początek.

+1

Dzięki, to jest dokładnie to, czego potrzebowałem! Myślę, że mogę to zrozumieć, ale być może wrócę z większą ilością pytań! – Sharon

3

Dla tych, którzy są bardziej zadowoleni z selektorów CSS3 i są gotowi dołączyć do swojego projektu jedną dodatkową klasę PHP, sugerowałbym użycie Simple PHP DOM parser. Rozwiązanie będzie wyglądać następująco:

$html = file_get_html('http://www.example.com/'); 

$ret = $html->find('p, span');  
$store = array(); 

foreach($ret as $element) { 
    $store[] = array($element->tag => array('text' => $element->innertext, 
              'color' => $element->color, 
              'style' => $element->style)); 
} 
print_r($store); 
+0

Sugerowane alternatywy strony trzeciej do [SimpleHtmlDom] (http://simplehtmldom.sourceforge.net/), które faktycznie używają [DOM] (http://php.net/manual/en/book.dom.php) zamiast analizowania ciągów : [phpQuery] (http://code.google.com/p/phpquery/), [Zend_Dom] (http://framework.zend.com/manual/en/zend.dom.html), [QueryPath] (http://querypath.org/) i [FluentDom] (http://www.fluentdom.org). – Gordon

+0

SimpleHtmlDom używa parsowania ciągów znaków? Tego nie wiedziałem. – karim79

+0

spójrz na jego źródło;) – Gordon

Powiązane problemy