PHP: angefangene HTML-Tags



  • Hallo,

    ich suche eine fertige Funktion oder einen fertigen Regexp, der mir folgendes Problem löst:

    Ein Textstring mit HTML-Formaten (i, b, span, etc) soll auf eine bestimmte Länge gekürzt werden.

    Es kann dadurch aber passieren, daß ein Tag nicht mehr geschlossen wird.

    Bsp:

    Ein <i>schöner Tag</i>.
    

    Ich suche nun eine PHP-Funktion, die folgende Aufgabe erfüllt:

    shortenHTMLText("Ein <i>schöner Tag</i>.", 10) == "Ein <i>sch</i>..."
    

    Ich will also offene HTML-Tags abgeschlossen bekommen.

    Gibt's dafür bereits fertige Lösungen?

    Es ist nämlich nicht ganz so trivial, da auch Verschachtelungen denkbar sind (<strong><i>), da muß man dann auf die Reihenfolge aufpassen.



  • Wo liegt da bitte das Problem, du als C++ Guru müsstest doch in der Lage sein, so eine Funkion in paar Minuten zu schreiben.

    Also, ich will dir mal dabei helfen:
    Erstmal kurzen wir den Text knallhart:
    string=strstr(string = strstr(string, 0, 10);

    So, dann schauen wir erstmal, ob wir versehentlich einen Tag durchgeschnitten haben, beheben es ggf. auch gleich:
    string = preg_replace("#(.*)<.*", "\1", $string);
    Schonmal wunderbar, du weißt wies gemeint ist.

    Den Rest schaffst du wohl alleine! ⚠
    explode(">", $string);
    Zählen wie viele Tags geöffnet und wie viele geschlossen wurden, falls welche nicht mehr geschlossen werden, die entsprechenden Tags wieder hinten anfügen.



  • Achja, man schreibt eigentlich nicht angefangene, sondern geöffnete HTML-Tags. ⚠



  • Hi Marc++us,
    ich würde zuerst den String abschneiden. Anschließend würde ich durch den String parsen und mir einen Stack aufbauen in den ich alle Tags schreibe. Dieser Stack wächst und schrumpft jenachdem ob ein neues Tag gefunden oder eins geschlossen wird. Am Ende des Strings musst du dann lediglich diesen Stack nach und nach wieder abbauen.



  • Herrmann@Work schrieb:

    Hi Marc++us,
    ich würde zuerst den String abschneiden. Anschließend würde ich durch den String parsen und mir einen Stack aufbauen in den ich alle Tags schreibe. Dieser Stack wächst und schrumpft jenachdem ob ein neues Tag gefunden oder eins geschlossen wird. Am Ende des Strings musst du dann lediglich diesen Stack nach und nach wieder abbauen.

    Sehr guter Ansatz, das funkioniert aber nur bei sauber verschachtelten Tags.
    <center><b>bla</center></b> -> mööp, center kann man vom Stack nicht runternehmen, weil ein b draufliegt. Also geht das Script davon aus, dass ab hier alle Tags abgeschnitten sind.

    Aber sonst ne schicke Lösung, würde ich jetzt auch so machen. 👍



  • Kenner des Problems schrieb:

    Wo liegt da bitte das Problem, du als C++ Guru müsstest doch in der Lage sein, so eine Funkion in paar Minuten zu schreiben.

    Hm, schau'n wir mal.

    1. Variante A

    Selbst schreiben - dauert ja doch länger als ein paar Minuten, mit Tests und Co sind's einige Stunden.

    1. Variante B

    Im Forum fragen, jemand hat so eine Funktion fertig, ich copy&paste und teste sofort - 1 Stunde.

    Ich habe die Zeit, in der ich alles selbst schreiben wollte um es selbst geschrieben zu haben, aus Vernunftgründen schon länger hinter mir gelassen.

    PS: mir ist schon klar wie man es machen muß. Ich fragte aber ja nach einer fertigen Lösung. Vielleicht hat jemand sowas kürzlich für sein Gästebuch erst programmiert.



  • hier werden keine hausaufgaben gemacht!

    lol, konnte ich mir nicht verkneifen 😉



  • Frage: "Ich will mit A folgendes machen"
    Antwort:: "Nimm doch B, das ist toll"

    *slap*



  • Wäre es erlaubt das Problem zu vereinfachen, indem Du einfach die Tags rausschmeißt und den blanken Text zusammenkürzt? Ich meine, sind die Formatierungen so wichtig?



  • Das geht natürlich immer, ist auch bei sowas kein Problem, aber hinlänglich doof, wenn man z.B. dies hier

    Ich habe hier ein Codefragment, wo ich immer einen Fehler bekomme:

    void main()
    {
       printf("Hallo Welt\n");
    }
    

    betrachtet - da in den Code reinzuschneiden ist unschön.


Anmelden zum Antworten