Hi,
mit welcher Funktion kann ich realisieren, dass mein PHP-Script die ersten 3 Sätze aus einem Text ausliest, der z.B. in MySQL auch in einer .txt-Datei gespeichert ist?
Das Problem habe ich schon mal gelöst.
Achte auf den Bugfix am Ende habe keine Lust es neu zu schreiben.
<?php
$text = 'PHP ist eine schöne Programmiersprache. Sie ist zwar für Leute wie mich zu kompliziert, aber wozu gibt das Selfforum. Hier sind ne Menge intelligente Köpfe, die einem helfen. Das möchte ich jedenfalls hoffen. Hmm, was soll ich noch schreiben? Ich denke, es müsste mittlerweile klar sein. Also in der Übersicht sind drei Sätze. In diesem Text sogar schon acht.';
preg_match_all ('=.+\b[.?!] =Us', $text, $saetze);
// print_r($saetze); // Zum testen
print $saetze[0][0];
print $saetze[0][1];
print $saetze[0][2];
?>
Erklärung zu dem regulären Ausdruck:
'=.+\b[.?!] =Us'
was haben wir da?
Am Anfang ein ' und am Ende auch. Die sind für PHP (String-Begrenzungszeichen)
Das dazwischen ist für die "PCRE library"
= als Begrenzung für PCRE
Der Punkt . paßt auf genau ein beliebiges Zeichen außer dem Zeilenendezeichen \n.
Das Pluszeichen + steht für {1,}, also für mindestens eine Wiederholung des vorhergehenden Ausdrucks)
\b ist eine Wortgrenze, also das Ende oder der Anfang eines Wortes
(Achtung es kann Probleme mit äöüß geben)
Dann kommt eine Zeichenmenge begrenzt durch [ und ]. In denn eckigen Klammern sind die Zeichen die hier vorkommen dürfen. Bei dir die Satzzeichen .?!
Noch ein Leerzeichen. (Ist halt so üblich nach einem Satzzeichen)
Und noch mal ein = als Begrenzung
Das U und das s sind 'Pattern Modifiers' sie verändern das verhalten des Suchmusters.
U sorgt dafür, daß Ungreedy gematched wird, normaler weise ist .+ sehr hungrig und würde alles nehmen was es bekommt :-)
S verändert das verhalten des Punktes . so das er auch auf \n (Zeilenendezeichen) past.
Also:
"Suche 'beliebige Zeichen' gefolgt von einer Wortgrenze auf die ein . oder ? oder ! folgt, mit einem Leerzeichen danach"
Achtung: Wenn der Text nur 3 Sätze hat werden nur 2 gefunden bei 2 = 1.
---------------
Bugfix für wenig Sätze:
preg_match_all ('=.+(\b[.?!] |$)=Us', $text, $saetze);
---------------
Der Linker