Intelligente Stringkürzung

Frage:
Ich möchte gernen einen Text nach 150 Zeichen abschneiden, dabei sollen allerdings Text der von zwei Unterstrichen eingeschlossen ist nicht mitgezählt werden. [...] Hat irgendwer eine Idee wie sich soetwas realisieren lässt? (aus dem SelfHTML Forum)
Lösung:

Folgendes PHP Script leistet das gewünschte:

<?php

// Konfiguration
$string  = "Ein kleiner __und sinnloser__ Text mit Lore Ipsum";
$letters = 17;

// Ein paar Variablen zum Kontrollieren des Programmablaufes
$position    = 0;     # Aktuelle Position im String
$counter     = 0;     # Zähler, wie viele Buchstaben wir schon haben
$in_nocount  = false; # Befinden wir uns innerhalb von __ ?
$new_string  = "";    # Neuer String
$rest_string = "";    # Restlicher String

// Solange wir noch nicht genug Buchstaben haben
while($counter < $letters)
{
    // Nächsten Buchstaben herrausschneiden
    $char = substr($string, $position, 1);
    // Sofern es den Anfang oder das Ende eines __ Bereiches darstellt
    if($char == "_" AND substr($string, $position + 1, 1) == "_")
    {
        $new_string .= "__";
        // Setze Kontrollvariable $in_nocount auf deren Gegenteil
        $in_nocount = $in_nocount ? false : true;
        // Und arbeite zwei Zeichen weiter im String
        $position += 2;
    }
    // andernfalls, wenn wir irgendwo im Text sind
    else
    {
        // Zeichen dem neuen String hinzufügen
        $new_string .= $char;
        // Wenn wir uns nicht in einem __ Bereich befinden, Counter
        // hochzählen
        if(!$in_nocount)
        {
            $counter ++;
        }
        // Position um eins erhönhen für nächsten Durchlauf
        $position ++;
    }
}
// Rest des Strings ins $rest_string schreiben
$rest_string = substr($string, $position);

// Ausgabe der Daten
echo "<pre>";
echo "Vorgabe:      $string\n";
echo "Neuer String: $new_string\n";
echo "Rest String:  $rest_string";
echo "</pre>";

?>

Man beachte auch die Version von Christian Kruse, welche noch etwas optimierter ist.

© 2005, Dennis Riehle.