html-Dokumentstruktur
trunx
- php
0 Jonas0 trunx0 dr.Colossos0 trunx0 dr.Colossos0 trunx
0 html-Dokumentstruktur erkennen
Tom0 bleicher0 trunx
Hallo an alle,
gibt es mit php eine vorgefertigte Möglichkeit, die Struktur eines gegebenen html-Dokuments zu bekommen? Also etwas wie:
<html>
<head>
<meta>
...
<meta>
</head>
<body>
<div>
...
</div>
</body>
</html>
sprich ohne Attribute (dies muss nicht zwingend sein) und ohne Inhalt und in der hierarchischen Form ihres Aufbaus? Oder muss man sich das selbst zusammenbasteln?
vielen Dank für mögliche Antworten
bye trunx
Ich denke nicht dass es sowas gibt, was sollte das den bringen?
Ich denke nicht dass es sowas gibt, was sollte das den bringen?
also mir fallen mehrere Verwendungsmöglichkeiten einer solchen Funktion ein, aber im Moment bastel ich mir nen Webeditor selbst zusammen - ich will auf diese Weise die editierbaren Bereiche markieren.
bye trunx
Hi,
evtl. hilft dir dieser Code, er erstellt aus einem HTML-String ($string) ein array aus Tags.
$pattern = '/(<(?:[^<>]+(?:"[^"]*"|'[^']*')?)+>)/';
// regex stammt nicht von mir, hab ich vor Monaten mal online gefunden, Quelle hab ich eben nicht mehr gefunden ...
// whitespace erstmal durch blanks ersetzen ...
$string = preg_replace('/(\s+)/', ' ', $string);
// ... dann string in in tokens teilen
$tokens = preg_split($pattern, trim($string), -1,
PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
Eingabe:
<html><head id="none2"></head><body id="none"></body></html>
Ausgabe:
$tokens[0] = "<html>";
$tokens[1] = "<head id="none2">";
$tokens[2] = "</head>";
$tokens[3] = "<body id="none">";
$tokens[4] = "</body>";
$tokens[5] = "</html>";
Might be helpful ...
Hi,
@dr.Colossos: also unter Verwendung deines code-Schnipsels sieht das Ganze jetzt bei mir wie folgt aus:
<?php
$pattern = '/(<(?:[^<>]+(?:"[^"]*"|'[^']*')?)+>)/';
$inhalt_ht = preg_replace('/(\s+)/', ' ', $dat_cont);
$html_arr1 = preg_split($pattern, trim($inhalt_ht), -1,
PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
$html_array = array();
$html_str ="";
$html_len = 0;
#Entfernung der Leerzeichen
foreach($html_arr1 as $htar) {
if($htar!=chr(32)) {
$html_array[] = $htar;
$html_str .= $htar;
$html_len++;
} }
$mono_tag = array('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param');
function struktur_array($start,$ende) {
global $mono_tag, $html_array, $html_str;
$struktur = array();
for($i=$start;$i<$ende;$i++) {
$hta = $html_array[$i];
if($hta{0}=="<") {
if($hta{1}=="!" || $hta{1}=="?") {
if($hta{2}=="-") {
$kom = "";
while(strpos($html_array[$i],"-->")===false) {
$kom .= $html_array[$i];
$i++;
}
$hta=$kom.$html_array[$i];
}
array_push($struktur,htmlentities($hta));
} else {
if(($pos=strpos($hta," "))===false)
$pos=strpos($hta,">");
$tag_name = substr($hta,1,$pos-1);
if(array_search($tag_name,$mono_tag)!==false) {
array_push($struktur,htmlentities($hta));
} else {
$tag_start=$i+1;
array_push($struktur,htmlentities($hta));
$count_tag=0;
$count_end=0;
for($j=$i+1;$j<$ende;$j++) {
if(strpos($html_array[$j],"<".$tag_name)!==false) {
if($count_tag==0)
$count_end=$j;
$count_tag++;
}
if(strpos($html_array[$j],"</".$tag_name)!==false && $count_tag==0) {
$i=$j;
break;
} elseif(strpos($html_array[$j],"</".$tag_name)!==false && $count_tag!=0)
$count_tag--;
}
if($count_tag!=0) {
if($count_end!=0)
$i=$count_end;
else
$i=$ende;
}
$tag_ende=$i;
if($tag_start!=$i)
$unter_tag=struktur_array($tag_start,$tag_ende);
if(count($unter_tag)!=0)
array_push($struktur,$unter_tag);
array_push($struktur,htmlentities($html_array[$i]));
}
}
} else {
array_push($struktur,htmlentities($html_array[$i]));
}
}
return $struktur;
}
$struktur = struktur_array(0,$html_len);
echo "<pre>";
print_r($struktur);
echo "</pre";
?>
bye trunx
Hi,
ja, sehe ich, hehe.
Wolltest nur den Code teilen (danke in diesem Fall), oder hast vergessen deine Frage zu stellen?
Ich hab den Code nur ueberflogen, hab nicht genau verstanden was du machst, aber ich wuerde dir schwer raten das objektorientiert zu erstellen - traumhaft im Vergleich zu sturkturierte Programmierung, und in PHP 5(!) wirklich so leicht ... wenn du PHP 4 nutzt, dann lieber nicht, da war's noch Schrott, aber dann denk ueber ein Upgrade nach.
Bau eine Klasse, z.B. HTMLParser, die hat eine Membervariable namens pattern ... dann kannst dir naemlich das unglaublich, unglaublich haessliche global sparen, dass ist das schlimmste Konstrukt das in deinem Code vorkommen kann ... wenn schon nicht oo, dann uebergibs wenigstens als Parameter.
Nur ein Tipp.
Hi,
Wolltest nur den Code teilen (danke in diesem Fall) ... ?
ja, das wollte ich :-) könnte ja sein, dass einer mal ein ähnliches Problem hat.
Ich hab den Code nur ueberflogen, hab nicht genau verstanden was du
machst, aber ich wuerde dir schwer raten das objektorientiert zu
erstellen - traumhaft im Vergleich zu strukturierte Programmierung,
und in PHP 5(!) wirklich so leicht ... wenn du PHP 4 nutzt, dann
lieber nicht, da war's noch Schrott, aber dann denk ueber ein
Upgrade nach.
hmm, leider hab ich davon, also von objektorientierter Programmierung keine Ahnung ... also ich sag mal so, wenn ich in javascript mit Klassen und Objekten, die bereits gegeben sind arbeiten muss, dann ist das kein Problem, aber selbst so etwas zu bauen habe ich schon versucht und hatte nicht den Erfolg - es war umständlich, lag meinem Denken fern und und und ... Ich bin mir sicher, dass ich da natürlich was falsch gemacht hab, alle behaupten schließlich oop sei nicht weiter schwer und für größere Projekte (die ich ja auch vorhabe) unerlässlich, aber wie gesagt, es hat noch nicht klick gemacht.
Bau eine Klasse, z.B. HTMLParser, die hat eine Membervariable namens pattern ... dann kannst dir naemlich das unglaublich, unglaublich haessliche global sparen, dass ist das schlimmste Konstrukt das in deinem Code vorkommen kann ... wenn schon nicht oo, dann uebergibs wenigstens als Parameter.
naja das mit der globalen Variablen, war ein Weg, das Ganze zum Laufen zu bringen ... :-)
Ziel dieses Codes war, die html-Struktur einer Webseite auszugeben, u.z. nicht nur getrennt "öffnende Tags", "Inhalt, "schließende Tags", bzw. "inhaltsleere Tags" usw., sondern auch die Hierarchie, s.d. man die Eltern- bzw. Kindelemente für ein gegebenes Element ermitteln kann. Ich brauche das für einen Online-Editor, den ich mir grad selbst bastle (mit contenteditable - ich weiß funktioniert nur im IE :-) ); und dieses contenteditable wird ja nicht vererbt. Also wollte ich auf diesem Weg alle Kindelemente eines zu editierenden Bereichs mit diesem Attribut versehen. Hmmm, war halt so ne Idee :-)
trotzdem vielen Dank für deine Hilfe
bye trunx++
Hi,
versteh das schon, und wenn der Code nur fuer dich ist, dann muss es ja auch nur funktionieren und nur du verstehen ... kenn ich, hehe.
Trotzdem, gib das mit OOP nicht auf, irgendwann machts da klick, und dann denkst nur noch in Klassen, Objekten und Assoziationen.
Hat mit unter den Vorteil dass du den Code von da oben in 3 Jahren auch noch verstehst.
Viel Erfolg bei deinem Projekt!
Hello trunx,
ich habe eben mal bei PEAR geschaut, da ist unter "HTML" auch nichts zu finden, nur fast sowas... Aber fast getroffen ist auch vorbei :-)
Ich habe mit auch schon oft so ein Tool gewünscht. Man könnte ja mal versuchen, eins zu bauen.
Wie müsste man da anfangen?
Erstmal bräuchten wir sicher eine Liste aller zulässigen HTML-Elemente mit ihrem öffnenden und schließenden Tag.
Dann müssten wir üben, die sauber zu erkennen, auch mit Attributen und Schwachsinn mittendrin.
Gute Übung für Regular Expressions. Könnte ich also gebrauchen ;-)
...
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
echo $begrüßung;
ich habe eben mal bei PEAR geschaut, da ist unter "HTML" auch nichts zu finden, nur fast sowas... Aber fast getroffen ist auch vorbei :-)
Dann such das lieber unter XML, denn dann findest du XML_HTMLSax und XML_HTMLSax3 - "A SAX parser for HTML and other badly formed XML documents". Für ordentlich XHTML-geformte Dokumente kann man natürlich auch einen XML-Parser verwenden.
echo "$verabschiedung $name";
vielen Dank erstmal für eure Ideen,
das mit Sax muss ich mir erstmal genauer ansehen, aber prinzipiell geht das schon in meine Richtung.
bye trunx
Hi an alle,
ich hab es jetzt selbst gebastelt, ich beschreib es mal kurz (falls es jemanden interessiert) - der aus der html-Datei ausgelesenen String wird in ein array umgewandelt, u.z. so:
array(
"tagname" => tagname,
attributname (z.B. id, type, src etc.) => attributwert,
...
"tagvalue" => array(), falls eingebettete tags folgen (die array-Struktur ist dann analaog)
taginhalt, sonst,
"abschluss" => "ja/nein", je nachdem, ob es ein schließendes tag gibt oder nicht,
)
bye trunx
Hello trunx,
ich hab es jetzt selbst gebastelt, ich beschreib es mal kurz (falls es jemanden interessiert) - der aus der html-Datei ausgelesenen String wird in ein array umgewandelt, u.z. so:
array(
"tagname" => tagname,
attributname (z.B. id, type, src etc.) => attributwert,
...
"tagvalue" => array(), falls eingebettete tags folgen (die array-Struktur ist dann analaog)
taginhalt, sonst,
"abschluss" => "ja/nein", je nachdem, ob es ein schließendes tag gibt oder nicht,
)
Wie hast Du die Aufteilung denn vorgenommen?
Per regular Expression?
Dann müsste die aber schon recht umfangreich geworden sein.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Hi,
Wie hast Du die Aufteilung denn vorgenommen?
Per regular Expression?
ehrlich gesagt habe ich keine Ahnung, was regular Expressions sind, klar es taucht immer mal auf und vllt habe ich sogar schon mal damit was gemacht :D , aber wenn, dann nicht bewußt als solch ein Ausdruck.
Ansonsten kannst du dir gern den code weiter unten im thread ansehen...
bye trunx
Grüße,
nimm doch die o.g. Zeilen und fass die zwischen echo " und ";
oder was genau suchst du?
MFG
bleicher
nimm doch die o.g. Zeilen und fass die zwischen echo " und ";
alles klar *lach*
oder was genau suchst du?
unterschiedliche html-Dokumente haben unter Umständen unterschiedliche Strukturen, diese soll ausgelesen und, entsprechend ihrer Hierarchie dargestellt werden.
bye trunx