Start · Sprachen · PHP · Referenz · IntlBreakIterator

IntlBreakIterator

Klasse

Basisklasse für alle ICU-Break-Iteratoren zum Auffinden von Text-Grenzen wie Wort-, Satz- oder Zeilengrenzen in Unicode-Text.

seit PHP 5.5.0 Kategorie: string

Signatur

class IntlBreakIterator implements IteratorAggregate

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;
    }
}
Hallo Welt Dies ist ein Test

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;
}
Satz 1: Das ist Satz eins. Satz 2: Das ist Satz zwei! Satz 3: Und der dritte?

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;
}
Zeichen 1: À (Bytes: 3) Zeichen 2: 🇩🇪 (Bytes: 8)

// 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.