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?

Kommentar schreiben

Deswegen lässt sich bemerken, dass diejenigen, welche Frömmigkeit
als Zweck und Ziel aufstecken, meistens Heuchler werden.
-- Goethe, Maximen und Reflektionen, Nr. 70