Signatur
Beschreibung
IntlBreakIterator ist eine abstrakte Basisklasse aus der PHP-Intl-Erweiterung, die auf der ICU-Bibliothek (International Components for Unicode) aufbaut. Sie ermöglicht das Auffinden von Unicode-konformen Text-Grenzen, z. B. Wort-, Satz-, Zeilen- oder Zeichengrenzen – unter Berücksichtigung der Regeln der jeweiligen Locale.
Da die Klasse abstrakt ist, wird sie nicht direkt instanziiert. Stattdessen verwendet man die speziellen Factory-Methoden wie IntlBreakIterator::createWordInstance(), IntlBreakIterator::createSentenceInstance(), IntlBreakIterator::createLineInstance() oder IntlBreakIterator::createCharacterInstance(), die passende Unterklassen bzw. Instanzen zurückgeben.
Typische Anwendungsfälle sind die korrekte Trennung von Wörtern in mehrsprachigen Texten, das Umbrechen langer Zeilen unter Berücksichtigung sprachlicher Regeln, das Zählen von Sätzen oder das Ermitteln von Cursor-Positionen in Texteditoren. Besonders bei ostasiatischen Sprachen wie Chinesisch oder Japanisch, die keine Leerzeichen zwischen Wörtern verwenden, liefert IntlBreakIterator deutlich bessere Ergebnisse als einfache String-Funktionen.
Die Klasse implementiert IteratorAggregate, sodass man über die gefundenen Text-Segmente bequem mit foreach iterieren kann, nachdem ein Text mit setText() gesetzt wurde.
Beispiele
Wörter in einem deutschen Text ermitteln
<?php
$bi = IntlBreakIterator::createWordInstance('de_DE');
$bi->setText('Hallo Welt! Dies ist ein Test.');
foreach ($bi->getPartsIterator() as $part) {
// Nur echte Wörter ausgeben (keine Leerzeichen/Satzzeichen)
if (trim($part) !== '' && ctype_alpha(trim($part))) {
echo $part . PHP_EOL;
}
}
Sätze in einem mehrsprachigen Text erkennen
<?php
$text = 'Das ist Satz eins. Das ist Satz zwei! Und der dritte?';
$bi = IntlBreakIterator::createSentenceInstance('de_DE');
$bi->setText($text);
$sentences = [];
$prev = $bi->first();
while (($pos = $bi->next()) !== IntlBreakIterator::DONE) {
$sentences[] = substr($text, $prev, $pos - $prev);
$prev = $pos;
}
foreach ($sentences as $i => $sentence) {
echo 'Satz ' . ($i + 1) . ': ' . trim($sentence) . PHP_EOL;
}
Unicode-Zeichen (Grapheme-Cluster) korrekt iterieren
<?php
// Emoji bestehen oft aus mehreren Code-Points
$text = "A\u{0300}" . "\u{1F1E9}\u{1F1EA}"; // À + Deutschland-Flagge
$bi = IntlBreakIterator::createCharacterInstance('en_US');
$bi->setText($text);
$count = 0;
foreach ($bi->getPartsIterator() as $char) {
$count++;
echo 'Zeichen ' . $count . ': ' . $char . ' (Bytes: ' . strlen($char) . ')' . PHP_EOL;
}
// Wichtig · Fallstricke
Voraussetzung: Die PHP-Erweiterung intl muss installiert und aktiviert sein (extension=intl in der php.ini). Außerdem wird eine ausreichend aktuelle ICU-Bibliothek benötigt.
Locale-Angabe: Die Factory-Methoden akzeptieren eine optionale Locale-Zeichenkette (z. B. 'de_DE', 'ja_JP'). Ohne Angabe wird die Standard-Locale verwendet (intl_get_default_locale()). Für viele Sprachen, besonders ostasiatische, ist eine korrekte Locale entscheidend für sinnvolle Ergebnisse.
Konstante IntlBreakIterator::DONE: Die Methoden next(), previous() usw. geben diese Konstante zurück, wenn kein weiterer Breakpoint mehr existiert. Eine Schleife sollte immer auf diesen Wert prüfen.
Mutabilität: Die Klasse ist nicht thread-sicher. Beim Einsatz in parallelen Prozessen (z. B. mit parallel) sollte pro Thread eine eigene Instanz erstellt werden.