You are not logged in.

  • Login

1

Sunday, September 16th 2007, 5:40pm

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:

Source code

1
2
3
4
5
Hallo
[B]Fett[/B]
<b>Nicht fett</b>

Neue Zeile!

Mit Hilfe einer Funktion wird daraus dann

Source code

1
2
3
4
<p>Hallo
<b>Fett</b>
&lt;b&gt;Nicht fett&lt;/b&gt;</p>
<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

3

Sunday, September 16th 2007, 6:29pm

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

Quoted

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

Quoted

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

4

Sunday, September 16th 2007, 7:18pm

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.

5

Sunday, September 16th 2007, 7:27pm

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

matthze

Unregistered

6

Monday, September 17th 2007, 3:08pm

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:

PHP Quellcode

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


Matthze

7

Monday, September 17th 2007, 3:22pm

Wozu habe ich denn dann BB-Code, wenn ich ihn nicht verwenden kann? :- )
So einfach ist es auch nicht.. ich überlege weiter .. bis dahin gebe ich eben noch den vollen Text aus..

8

Monday, September 17th 2007, 4:47pm

Er meint das sicherlich so:
  • Also erstmal mit strip_tags die Html Tags entfernen. (bbcodes bleiben erhalten)
  • Dann abschneiden.
  • Dann bbcodes in html tags umwandeln.
Aber ohne Prüfung ob die Tags geöffnet/geschlossen sind, hilft das auch nichts.

Bastian

Unregistered

9

Tuesday, May 27th 2008, 10:38pm

Hallo PHP0Kid!

Habe das gleiche Problem wie du!
Hast du eine Lösung entwickelt?

Grüße,
Bastian

10

Wednesday, May 28th 2008, 12:42am

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

11

Friday, June 13th 2008, 4:12pm

Ein kurzer Hinweis sei mir vergönnt: http://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 :)

12

Sunday, June 15th 2008, 2:30pm

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

Similar threads

Social bookmarks