Hallo,
ich habe einen teuflischen Plan ;-).
Ich habe eine sehr lange Tabelle in HTML. In dieser Tabelle kommen sporadisch TH-Tags vor. Ich möchte diese Tabelle an diesen Tags auftrennen und eine neue Tabelle daraus machen, um Seitenumbrüche zu ermöglichen.
Einfach: Mit Explode, - doch so leicht ist es nicht.
Denn die TH-Tags sind natürlich unterschiedlich "weit" von einandern entfernt. Manchmal nur eine Zeile.
Ich muss also nachdem ich Explode benutzt habe, die Tabelle u.U. wieder "zusammenkleben". Im Moment mache ich das auch genau so.
Es geht aber noch weiter. Gelegentlich sind diese Mammuttabellen selber nur teil einer Tabelle und durch das Zerlegen wird das Tag der umschliessenden Tabelle nicht geschlossen.
Auch das prüfe ich derzeit recht umständlich ab.
Gibt es einen einfachen Algorithmus für das Problem der Zerlegung mehrfach verschachtelter HTML-Tags in PHP?
Eventuell gar ein Script, welches mir einen Text an einer Beliebigen Stelle zerlegt und daraus zwei korrekte HTML-Texte macht?
bye
PCO
Homepage selbermachen 7.852 Themen, 35.619 Beiträge
... Hm, ich neige in solchen Fällen dazu, einfach alle HTML-Tags wegzustrippen und das ganze dann neu aufzubauen. Mehrfach ineinender verschachtelte "Höllentabellen" sind für mich ein Indiz für schlechtes HTML-Design. Handelt es sich wirklich um tabellarische Daten, oder könnte man den Content generell anders (einfacher?) strukturieren?
Keine Lösung, aber vielleicht ein Denkanstoß ...
HTH, Z.
Spontane Idee: Mittels Reg-Exps die THs aus inneren Tabellen erstzen, dann Tabelle auftrennen und am Ende die inneren THs wieder zurückverwandeln...
Oder: Auf explode verzichten, die Tabelle als Text durchlaufen und dabei die Table-Ebene mit speichern. Trennen dann nur wenn die Table-Ebene=0 und der Abschnitt hinreichend lang...
Gruß
Borlander
Die Lösung des Problems wäre ein rekursiver Algorithmus. Die sind aber in PHP nicht gestattet und ein Iterativer hat ein zu unhomogenes Laufzeitverhalten, welches bei sehr komplexen Tabellenkonstrukten schnell zu Timeouts führt - thats the problem.
Das Problem ist ferner, dass ich die Daten dabei nicht verändern kann / darf.
Meine derzeitige Lösung ist das trennen der Kette an jedem "Kleiner-Zeichen". Hierdurch habe ich, korrektes HTML voraus gesetz eine Trennung erreicht welche genauso viele öffnende, wie schliessende Tags am Beginn hat.
Dann prüfe ich die erste Stelle der Nachfolgekette auf einen Slash und vermerke im Feld: Hier wird mit einem Closetag begonnn (Feld[element][closetag] = 1) oder nicht (=0).
Ferner läuft ein Zähler mit, der die öffnenden Tags und schliessenden liest und speichert.
Auch der ist nicht einfach, da ja jedes Tag wieder Parameter enthalten kann.
Also durchlaufe ich jedes Feldelement auf der Suche nach dem ersten "Grösser-Zeichen" und schneide den entsprechenden Teil ab.
Nun speichere ich bereinigten Text und HTML-Tags in der Reihenfolge wie sie aufgetreten sind in ein Feld.
In diesem Feld checke ich die Zeichenkettenlängen bis ein Grenzwert erreicht ist.
Hier werden dann alle schliessenden Tags bis zum $TagCounter=0 angehängt.
In der darauffolgenden Zeichenkette werden alle öffnendenTags von $TagCounter bis 0 angehängt.
Fertig - sauber getrennt, alles kommt mit.
Scheisse kompliziert und absolut zu Serverlastig.
Das ist das Problem
PCO
Warum? Sind doch nur die Daten auf erster Ebene interessant - und für das Zählen der Tabellen-Ebenen braucht es keine Rekursion...
Meine derzeitige Lösung ist das trennen der Kette an jedem "Kleiner-Zeichen".
Das aktuelle Verfahren scheint mir auch zu aufwendig - als Trennstellen kommen ja sowieso ausschließlich TH-Tags in Frage...
Das Problem ist ferner, dass ich die Daten dabei nicht verändern kann / darf.
Da könnte man doch ggf. eine Kopie anlegen ;-)
Was ich für deutlich einfacher halte:
-
- <TH suchen für Anfang
- <TR alles dazwischen ist schon mal Header
- <TH - alles vor dem davorliegenden <TR> gehört dann mit rein *(!)
- von vorne beginnen
* sofern kein <TABLE dazwischen ist:
Falls Ja: Ebenenzähler erhöhen, falls </TABLE reduzieren (falls beide drin muß der schließende natürlich weiter hinten stehen). Jetzt solange weiter nach 3. suchen bis wir auf niedrigster Tabellenebene sind :-)
Gruß
Borlander
Nun, der Gedanke war auch mein erster.
Es wird so ähnlich auch werden.
Danke bis hier...
PCO