PHP: Text in Sätzen zerlegen
2. März 2008
Für ein Projekt habe ich eine Funktion gesucht, um einen Text in seine Sätze zu zerlegen. Klingt nach einer einfachen Aufgabe, ist es aber nicht.
Zuerst versuchte ich die scheinbar einfachste Methode: explode(). Mit dieser Funktion lässt sich ein String anhand eines Trennzeichens zerlegen. Nun habe ich aber drei (Punkt, Fragezeichen und Ausrufezeichen).
Also musste eine intelligentere Funktion ran: preg_split(). Dieser reguläre Ausdruck brachte ein sehr gutes Ergebnis, hatte jedoch ein Problem: am Ende fehlten alle Satzzeichen.
$sentences = preg_split('#\.|!|\?#', $source, -1, PREG_SPLIT_NO_EMPTY);
Da ich sonst nichts fand, schrieb ich kurzerhand meine eigene Funktion, die arbeitet wie ich möchte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | /** * Teilt einen String in Sätze auf * * @param string $source Text zum Trennen * @author Michael Mayr (http://michfrm.net) * @return array */ function SplitSentences($source) { $s = array(); $marks = array('.', '!', '?'); // count strlen every loop because $source can change while loop for ($i = 0; $i < strlen($source); ++$i) { $c = $source[$i]; foreach ( $marks as $mark ) { if ( $c == $mark ) { $s[] = substr($source, 0, $i) . $mark; $source = trim(substr($source, $i + 1)); $i = 0; } } } return $s; } $text = 'This ist ein Satz. Dies ein Ausruf! Und das einfach nur eine Frage?'; print_r(SplitSentences($text)); |
Ausgabe:
Array
(
[0] => This ist ein Satz.
[1] => Dies ein Ausruf!
[2] => Und das einfach nur eine Frage?
)
Ich hoffe, diese Funktion kann noch anderen nützlich sein.
vllt nicht unbedingt die nützlichste funktion, aber zumindest schön zu wissen, dass es noch menschen gibt, die sich solcher sinnlosen dinge annehmen^^
ist auch ziemlich einfach zu verstehender code und vllt auch zu anderen zwecken einsetzbar.
greeetZ
Dominik
Warum sollte so eine Funktion sinnlos sein?
Das Problem beim Zerlegen von Sätzen ist, dass man nicht einfach bei Punkt, Ausrufezeichen und Fragezeichen trennen darf. In den meisten Fällen trifft das zwar zu, aber es gibt ja noch Datumsangaben oder Abkürzungen, wo der Punkt keinen Satz beendet. Dann gibt es noch die Möglichkeit, dass Satzzeichen mehrfach auftauchen (z.B. !!!).