HTML Tags schließen nach substr()

BobDerMeister

Erfahrenes Mitglied
Hi

in meinem News System schneide ich für die Übersicht nach dem 1000ten Zeichen den Newstext ab. Das funktioniert auch wunderbar.
PHP:
substr($row['news_text'], 0, strpos($row['news_text'], ' ', 1000))
Da allerdings in den News auch HTML Tags sind, sind nach dem zerschneiden noch diverse HTML Tags offen. Gibt es eine Möglichkeit die Tags per php zu schließen? Ich wollte es eigendlich vermeiden im Admin Interface 2 Eingabefelder zu machen (Teaser und Text).
 
hi!
schreib doch einfach ne procedure die alle geöffneten html tags schliesst!
musst halt nur die geöffneten finden ( stichwort 'preg_match' usw. ). danach gleichst du die anzahl der geöffneten mit der anzahl der geschlossenen ab und alles was noch nicht geschlossen wurde schliesst du dann.
is viel schreibarbeit/denkarbeit, zeitaufwändig, aber dürfte nich äußerlich kniffelig werden.
wüsste aber nich wie mans leichter/kürzer lösen kann, außer halt 2 interfaces zu benutzen bzw. noch besser, die news immer in nen festen bereich einzubauen ( OOP lässt grüßen ).

mfg,
tiischa
 
Kann mir jemand ein Suchmuster verraten, mit dem man die HTML- Tags findet? Und wäre hier nicht sogar preg_match_all günstiger zu nutzen?
 
Hier für geöffnete Tags:
Code:
"\<[^/].*\>"

Und hier für geschlossene Tags:
Code:
"\</.*\>"

//EDIT: wobei ich jetzt nicht genau weis ob man '<' '>' ein '\' vorsetzen muss.

Lg, Yanick
 
Und muss nochmal doof fragen, dass durchsucht mir jetzt auch den ganzen String?
Und was ist nun besser? preg_match oder preg_match_all?
 
preg_match() gibt die Anzahl der Übereinstimmungen mit Suchmuster zurück. Das ist entweder 0 (keine Übereinstimmung) oder 1, weil preg_match() die Suche nach der ersten Übereinstimmung beendet.

Ergo wäre preg_match_all() für dich wahrscheinlich besser.
 
Eigentlich habe ich bisher immer erfolgreich bisher probiert RegEx und die preg-match- Funktionen zu umgehen. Aber diesmal komme ich nicht umher. Hab gerade mal eben einen Kleinen Test gestartet. Aber irgendwie werd ich aus dem Resultat auch nicht schlau.

PHP:
<?php
$string ="<b>Dast ist ein <i>Text</i> mit vielen <strong>Html-Tags, allerdings werden nicht alle geschlossen";
preg_match_all ("<[^/].*>" , $string , $starttags , PREG_SET_ORDER);
preg_match_all ("</.*>" , $string , $endtags , PREG_SET_ORDER);
print_r ( $starttags ) ;
print "<br><br>";
print_r ( $endtags ) ;
?>

Ausgabe:
Code:
Array
(
    [0] => Array
        (
            [0] => <b>Dast ist ein <i>Text</i> mit vielen <strong>Html-Tags, allerdings werden nicht alle geschlossen
        )
)
<br><br>Array
(
    [0] => Array
        (
            [0] => /i> mit vielen <strong>Html-Tags, allerdings werden nicht alle geschlossen
        )
)
 
Also ich würds so machen:

Du suchst dir Alle Tags die geöffnet werden und speicherst diese dann in ein Array.
Danach suchst du alle Tags die geschlossen werden, und streichst diese dann aus deinem Array, zum schluss musst du nur mehr dein Array durchgehen und alle vorhandenen Tags schließen.

Das suchen der offenen und geschlossenen Tags machst du mittels Regular Expressions, mit der Fkt. preg_match_all

Lg, Yanick
 
Zurück