Strings wortweise kürzen mit regulären Ausdrücken

Warum das Ganze nicht einfach mal mit RegEx lösen statt sich auf PHP verlassen.

Strings wortweise kürzen mit regulären Ausdrücken

Strings wortweise kürzen mit regulären Ausdrücken

Ist doch ganz einfach mit PHP

Einen String wortweise kürzen (z.B. auf 200 Zeichen) ist doch eigentlich ganz einfach

strstr(wordwrap($string, 200), "\n", true) 

Klingt zwar ganz einfach, hat aber auch Fußangeln:

  1. Mit UTF-8 ist das ganze nicht kompatibel. 
  2. Was ist wennn schon vorher Zeilenumbrüche im Text sind?

Das zweite Problem könnte man lösen, indem man einfach ein anderes Zeichen im wordwrap() benutzt.

strstr(wordwrap($text, 200, "<special>\n"), "<special>\n", true) ;

Das erste Problem ist schon kniffeliger, dazu braucht es dannn einen neue wordwrap() Funktion wie zum Beispiel diese auf en Seiten des PHP Manuals (http://php.net/manual/de/function.wordwrap.php#117207)

<?php
function mb_wordwrap($string, $limit)
{
    $string = strip_tags($string); //Strip HTML tags off the text
    $string = html_entity_decode($string); //Convert HTML special chars into normal text
    $string = str_replace(array("\r", "\n"), "", $string); //Also cut line breaks
    if(mb_strlen($string, "UTF-8") <= $limit) return $string; //If input string's length is no more than cut length, return untouched
    $last_space = mb_strrpos(mb_substr($string, 0, $limit, "UTF-8"), " ", 0, "UTF-8"); //Find the last space symbol position

    return mb_substr($string, 0, $last_space, "UTF-8").' ...'; //Return the string's length substracted till the last space and add three points
}

Das Ganze ist dann allerdings weder kurz noch elegant.

Regex zur Rettung

Nach einem wenig knobeln fanden sich dann doch gleich mehrere Möglichkeiten das Problem mit einem einfachen regulären Ausdruck zu lösen.  

// Einfach abschneiden, ergibt immer weniger als 200 Zeichen.
$text= preg_replace("/(.{1,200}\b)(.+)/isu", "$1", $text);

// Oder mit charmanten Pünktchen am Ende des Strings.
$text= preg_replace("/(.{1,200}\b)(.+)/isu", "$1...", $text);

// Auch nett, mit freundlichen Lookbehind.
// Allerdings ergeben sich hier 200 Zeichen + alle Zeichen bis zum nächsten Wortende.
$text= preg_replace("/(?<=.{200})\W.*/isu", "", $text);

Problem gelöst und zwar in einer Zeile...     

Das könnte Sie auch interessieren

Die ersten 100 Zeichen eines Textes
oder vielleicht auch die letzten ?
Die perfekte Email Validierung Die perfekte Email Validierung
Kann man irgendwie Emails wirklich zuverlässig validieren?

Der Antichrist. Fluch auf das Christenthum.
1.
- Sehen wir uns ins Gesicht. Wir sind Hyperboreer, - wir wissen gut
genug, wie abseits wir leben. "Weder zu Lande, noch zu Wasser wirst du
den Weg zu den Hyperboreern finden": das hat schon Pindar von uns
gewusst. Jenseits des Nordens, des Eises, des Todes - unser Leben,
unser Glück ... Wir haben das Glück entdeckt, wir wissen den Weg, wir
fanden den Ausgang aus ganzen Jahrtausenden des Labyrinths. Wer fand
ihn sonst? - Der moderne Mensch etwa? "Ich weiss nicht aus, noch ein;
ich bin Alles, was nicht aus noch ein weiss" - seufzt der moderne
Mensch ... An dieser Modernität waren wir krank, - am faulen Frieden,
am feigen Compromiss, an der ganzen tugendhaften Unsauberkeit des
modernen ja und Nein. Diese Toleranz und largeur des Herzens, die
Alles "verzeiht", weil sie Alles "begreift", ist Scirocco für uns.
Lieber im Eise leben als unter modernen Tugenden und andren Südwinden!
... Wir waren tapfer genug, wir schonten weder uns, noch Andere: aber
wir wussten lange nicht, wohin mit unsrer Tapferkeit. Wir wurden
düster, man hiess uns Fatalisten. Unser Fatum - das war die Fülle, die
Spannung, die Stauung der Kräfte. Wir dürsteten nach Blitz und Thaten,
wir blieben am fernsten vom Glück der Schwächlinge, von der "Ergebung"
... Ein Gewitter war in unsrer Luft, die Natur, die wir sind,
verfinsterte sich - denn wir hatten keinen Weg. Formel unsres Glücks:
ein Ja, ein Nein, eine gerade Linie, ein Ziel ...
-- Friedrich Wilhelm Nietzsche