Text "logisch" abschneiden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Text "logisch" abschneiden

    Hi,

    ich bin mir ziemlich sicher, dass es ein Thema in der Art schon gab (habe auch danach gesucht, aber womöglich in den falschen Foren - alle waren mir dann doch zu viel). Nun, mein Problem ist folgendes: Ich habe einen Text, der in etwa so aussehen könnte:

    Quellcode

    1. Hallo
    2. [B]Fett[/B]
    3. <b>Nicht fett</b>
    4. Neue Zeile!

    Mit Hilfe einer Funktion wird daraus dann

    Quellcode

    1. <p>Hallo
    2. <b>Fett</b>
    3. &lt;b&gt;Nicht fett&lt;/b&gt;</p>
    4. <p>Neue Zeile!</p>

    Das ist soweit auch gut und gewollt.

    Nun will ich aber ein Stück davon wegschneiden (zum Beispiel für News), damit man dann später beispielsweise auf einen Link "mehr.." klicken kann, um alles anzuzeigen. Mit substr ist das ja grundsätzlich möglich, aber nun ist das Problem dass das nicht ausreicht, denn es könnte ja sein, dass ich ein Stück vom HTML-Code wegschneide, also beispielsweise ein offenes oder ein offenes bleibt und das wäre ein schweres Problem :D

    Ich denke hierbei an reguläre Ausdrücke, aber mir fällt im Moment nichts brauchbares ein. Vielleicht habt ihr eine gute Idee oder bereits eine Lösung?


    Vielen Dank,


    PHP0Kid
  • Tut mir Leid, aber das wäre zu einfach ;D
    Mir ist eben aufgefallen, das wbb3 mir hier ständig irgendwelche Angaben verhaut mit BB-Code und HTML-Code *narv* (wbb stinkt -.-)

    Ich will nicht, dass er nach einer bestimmten Länge mit dem Zeichen <br /> oder ähnlichem umbricht, sondern er soll in etwa die ersten 300 Zeichen vom Text wegschneiden, aber dabei aufpassen, dass er nicht innerhalb eines HTML-Tags abschneidet:
    Ich habe beispielsweise
    Text<a href="#">Link</a>Ein weiterer Text

    Nun soll er nicht nach 20 Zeichen bereits abschneiden, sondern nach dem Ende des HTML-Tags suchen, was eben bei 24 Zeichen liegt. Sonst hätte ich nacher
    Text<a href="#">Link

    Und damit würden alle nachfolgenden Inhalte ein Link sein, was natürlich Quark ist.

    Ich hoffe ihr versteht nun mein Prob ;D

    lG
  • Ok, ich dachte du wolltest sowieso Entities erzeugen. Aber fertige Funktionen gibts dazu nicht.
    Wenn du es unbedingt haben willst, musst du das selbst machen...
    • Text lesen, dabei HTML Tags ergänzen
    • öffnendes gefunden $tags['welches']++
    • schließendes gefunden $tags['welches']--
    • wenn spezifizierte Maximallänge erreicht (tags zählst du natürlich nicht mit), dann schaue, welche Tags nicht geschlossen sind und schließe sie
    Falls du das umsetzt, dann poste die Funktion mal hier. Ist sicherlich ganz nützlich.
  • Naja aus deinem groben Algorithmus werde ich noch nicht ganz so schlau.
    Bisher hatte ich mir folgendes überlegt:
    Mit Hilfe von preg_match alle Abschnitte in [ b] [/ b] oder [ u] [/ u] suchen und dann eben alle zählen und schließlich so viele zusammenfügen, dass es in etwa die angegebene Menge von z.B. 400 Zeichen ergibt. Ist aber ziemlich umständlich bzw hat noch nicht geklappt ..

    Ich überlege mir nacher mal abseits vom PC was.. vllt fällt mir was Gutes ein :D
  • Hi,
    wenn du nur die Zeichen möchtest, dann gib den Text doch einfach ohne "Formatierung", also ohne html Tags an. mit strip_tags ist das möglich. Bsp:

    Quellcode

    1. $html_text = bbcode($bbcode_text); // Hier die Klasse oder Funktion zum parsen ändern
    2. $clean_text = strip_tags($html_text); // Entfernt die HTML Tags aus dem Textstring
    3. $text = substr($clean_text, 0, 200); // Schneided den Text bei 200 Zeichen ab
    4. echo $text."...&nbsp;&nbsp;<a href=\"".$artikel_link."\">[weiterlesen]</a>";


    Matthze
  • Hi,

    ich habe mich nie weiter vorangewagt und bei meinem letzten Projekt einfach ein [break] mit in den Text gesetzt, so dass an dieser Stelle abgebrochen wird.
    Die Lösung habe ich theoretisch, praktisch aber etwas komplexer umzusetzen. Du musst ein Parser schreiben, der wie ein BBCode-Parser den Text logisch einliest (also in einer Art Baum- oder Objektstruktur) und dann eine bestimmte Zeichenanzahl zählt und dort das nächste schließende Objekt sucht und dann alle anderen offenen Tags (Objekte) schließt .. nicht sehr einfach umzusetzen, aber sicherlich machbar.

    Leider habe ich im Moment keine Zeit das zu machen und andere Projekte haben Vorrang. Vielleicht mach ich mich im Sommer einmal hinter eine solche Bibliothek ;)
    Aber vielleicht findest du ja eine Lösung .. !


    lG
  • Ein kurzer Hinweis sei mir vergönnt: de.wikipedia.org/wiki/Normalisierung_(Datenbank)

    Oder anders ausgedrückt: Warum Fließtexte für Newsmeldungen zerschnippseln, wenn ein Datenbankfeld "teaser" den gleichen Zweck erfüllt? Sprich: Teil die Texte auf, bei einem Klick auf "...mehr" kommt dann eben erst <?=$teaser;?> und dann <?=$text;?>. In der Übersicht durchläufst Du eben nur $teaser. Dann brauchst Du nicht hin- und herparsen etc. Einfach gleich die Datenbankstruktur klug anlegen :)
  • Sorry, aber das ist nicht ganz korrekt. Klar, wäre es so sehr einfach gemacht. Aber es hat keinerlei Sinn Text, der als eine Einheit anzusehen ist, zu trennen. Das, was du als Teaser bezeichnest, gehört für mich genauso zum Inhalt (soll also in meinem Fall ein Ausschnitt des Inhalts sein). Wäre es eine Übersicht oder Zusammenfassung, wäre deine Lösung durchaus korrekt. Möchte ich aber selber vorgeben (konfigurieren), wie viel ich von meinen Inhalten in einer Art Übersicht zeigen möchte und zwar als Ausschnitt und nicht als Zusammenfassung, arbeitet man nicht mit getrennten Spalten. Ich verstehe durchaus deine Argumente und die Lösung hat durchaus seine Vorteile, aber auch einige Nachteile: Derjenige, der den Artikel speichert, entscheidet, was im "Teaser" vorkommt. Später kann ich nicht mehr entscheiden, wie lang der Teaser sein soll, sondern er ist immer eine Zusammenfassung, dessen was noch kommt. Ich dagegen möchte ein Ausschnitt, bzw. den Anfangstext eines Artikels..

    lG