Homepage selbermachen 7.852 Themen, 35.619 Beiträge

PHP Bastelaufgabe: Explode

pco / 5 Antworten / Baumansicht Nickles

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

bei Antwort benachrichtigen
Zaphod pco „PHP Bastelaufgabe: Explode“
Optionen

... 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.

bei Antwort benachrichtigen
Borlander pco „PHP Bastelaufgabe: Explode“
Optionen

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

bei Antwort benachrichtigen
pco Borlander „Spontane Idee: Mittels Reg-Exps die THs aus inneren Tabellen erstzen, dann...“
Optionen

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

bei Antwort benachrichtigen
Borlander pco „Die Lösung des Problems wäre ein rekursiver Algorithmus. Die sind aber in PHP...“
Optionen
Die Lösung des Problems wäre ein rekursiver Algorithmus.
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:

  1. <TH suchen für Anfang
  2. <TR alles dazwischen ist schon mal Header
  3. <TH - alles vor dem davorliegenden <TR> gehört dann mit rein *(!)
  4. 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
bei Antwort benachrichtigen
pco Borlander „ Warum? Sind doch nur die Daten auf erster Ebene interessant - und für das...“
Optionen

Nun, der Gedanke war auch mein erster.
Es wird so ähnlich auch werden.

Danke bis hier...

PCO

bei Antwort benachrichtigen