Text nach 150 Zeichen schneiden und nicht alles mitzählen
AllesMeins
- php
1 Dennis0 dedlfix1 Christian Kruse0 Dennis0 AllesMeins1 Christian Kruse0 at
Hiho,
folgendes Problem. Ich möchte gernen einen Text nach 150 Zeichen abschneiden, dabei sollen allerdings Text der von zwei Unterstrichen eingeschlossen ist nicht mitgezählt werden. Also kleines Beispiel mit Schnitt nach 15 Zeichen:
Text1: "Irgend eine möglichst belangloser Text"
Text2: "Heute ist __ein wunderschöner sonniger__ Tag und ich bin froh"
Text 1 würde ganz normal nach 15 Zeichen geschnitten werden, es bliebe also "Irgend eine mög" übrig. Hingegen soll Text2 auch nach 15 zeichen geschnitte werden, dabei sollen die __ und alles was sie umrahmen aber nicht mitgezählt werden, also "Heute ist __ein wunderschöner sonniger__ Tag " (15 Zeichen ausserhalb der Unterstriche). Hat irgendwer eine Idee wie sich soetwas realisieren lässt?
Am liebsten wäre mir noch wenn der Text jeweils an der ermittelten Stelle in einen Array zerteilt wird, also der Rest vom text nicht einfach verworfen wird sondern ich ihn auch noch zur Verfügung habe.
Grüsse
Marc
Hi AllesMeins,
Hat irgendwer eine Idee wie sich soetwas realisieren lässt?
Eine fertige Funktion dafür kenne ich nicht - es wird aber mit den String-Funktionen lösbar sein. Ich habe mich gerade mal hingesetzt und ein kleines Script geschrieben, was die gewünschte Aufgabe löst:
<?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>";
?>
Soweit ich das bis jetzt getestet habe, funktioniert es einwandfrei.
MfG, Dennis.
Hiho,
vielen Dank! Ich werde noch ein wenig dran rumbasteln aber im grossen und ganzen ist das genau das, was ich gebraucht habe.
Viele Grüsse
Marc
echo $begrüßung;
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?
Mit einem (ungierigen) Regulären Ausdruck können die __Textstellen__ entfernt werden. Danach kannst du mit substr() den Text auf Länge kürzen.
Am liebsten wäre mir noch wenn der Text jeweils an der ermittelten Stelle in einen Array zerteilt wird, also der Rest vom text nicht einfach verworfen wird sondern ich ihn auch noch zur Verfügung habe.
Auch das geht mit einem weiteren substr().
echo "$verabschiedung $name";
Hiho,
ich will die entsprechenden Stellen aber nicht raus haben sondern mit drinne behalten. Das ist ja das Problem. Sie sollen drinne sein, aber nicht gezählt werden...
Marc
你好 AllesMeins,
folgendes Problem. Ich möchte gernen einen Text nach 150 Zeichen
abschneiden, dabei sollen allerdings Text der von zwei Unterstrichen
eingeschlossen ist nicht mitgezählt werden.
Mal exemplarisch, wie man an so ein Problem herangehen kann:
Durchlaufe den String zeichenweise und zähle mit. Triffst du auf das
Zeichen _ und ist das darauf folgende Zeichen auch _, (1) dann höre auf zu
zählen bis du beim nächsten _ ankommst. Ist das darauf folgende Zeichen
auch ein _, fange wieder an zu zählen, ansonsten siehe (1). Bist du mit
deinem Zählerstand bei 150 angekommen, gib den String-Index zurück.
Schneide nun den String von 0 bis zum zurückgegebenen Index aus.
Ich denke, ein so einfacher Algorithmus sollte dir keine Probleme bereiten.
再见,
克里斯蒂安
Hi Christian,
Durchlaufe den String zeichenweise und zähle mit. Triffst du auf das
Zeichen _ und ist das darauf folgende Zeichen auch _, (1) dann höre auf zu
zählen bis du beim nächsten _ ankommst. Ist das darauf folgende Zeichen
auch ein _, fange wieder an zu zählen, ansonsten siehe (1). Bist du mit
deinem Zählerstand bei 150 angekommen, gib den String-Index zurück.
Schneide nun den String von 0 bis zum zurückgegebenen Index aus.
Ungefähr so hab ichs ja auch gemacht - nur dass ich jedes ausgelesene Zeichen
auch direkt rüberkopiert habe. Hat deine Methode mit dem Schneiden am Ende
irgendwelche (Performance) Vorteile?
Oder kommt das nur so von einem C-Programmierer, der erst wissen muss, wie
viel Speicherplatz er für eine Variable reservieren muss, bevor er sie
füllen kann? ;-)
MfG, Dennis.
你好 Dennis,
Ungefähr so hab ichs ja auch gemacht - nur dass ich jedes ausgelesene Zeichen
auch direkt rüberkopiert habe.
Ja, habe ich gelesen ;) Aber ich habe mit voller Absicht nochmal eine
Anleitung geschrieben.
Hat deine Methode mit dem Schneiden am Ende irgendwelche (Performance)
Vorteile?
Ja: bei meiner Methode muss nur einmal Speicher alloziiert werden ;) Bei
deiner muss jedesmal ein neuer String erstellt werden, also jedesmal
Speicher alloziiert werden. Das ist jedesmal ein (langsamer) System-Call.
Oder kommt das nur so von einem C-Programmierer, der erst wissen muss, wie
viel Speicherplatz er für eine Variable reservieren muss, bevor er sie
füllen kann? ;-)
Hehe, nein ;)
再见,
克里斯蒂安
Hi Christian,
Hat deine Methode mit dem Schneiden am Ende irgendwelche (Performance)
Vorteile?Ja: bei meiner Methode muss nur einmal Speicher alloziiert werden ;) Bei
deiner muss jedesmal ein neuer String erstellt werden, also jedesmal
Speicher alloziiert werden. Das ist jedesmal ein (langsamer) System-Call.
Ah - das ist einem als „PHP-Programmierer” gar nicht so bewusst, zumindest
mir nicht - bei jeder Änderung in der Länge eines Strings muss also ein
neuer Speicher assoziiert werden? Ok, dann ist natürlich klar, warum deine
Methode (mehr oder weniger deutlich) performanter ist.
MfG, Dennis.
Hiho,
danke für die Hinweise. Ich denk mir halt immer "Mensch, da muss es doch was einfacheres geben als das alles per Hand zu erledigen" und deshalb frage ich. Iss einfach meine angeborene Faulheit ;)
Marc
你好 AllesMeins,
danke für die Hinweise. Ich denk mir halt immer "Mensch, da muss es doch
was einfacheres geben als das alles per Hand zu erledigen" und deshalb
frage ich. Iss einfach meine angeborene Faulheit ;)
Ich werde es nie verstehen… den Algorithmus tippt man doch in 10 Minuten,
da würde ich mir gar nicht die Mühe machen irgendwas zu suchen, geschweige
denn in einem Forum zu posten.
再见,
克里斯蒂安
Hallo.
Iss einfach meine angeborene Faulheit ;)
Faules sollte man besser nicht essen.
MfG, at
Grundlage für Zitat #829.