Start · Sprachen · PHP · Referenz · IntlRuleBasedBreakIterator

IntlRuleBasedBreakIterator

Klasse

Break-Iterator, dessen Segmentierungsverhalten durch benutzerdefinierte ICU-Regelmengen gesteuert wird.

seit PHP 5.5.0 Kategorie: string

Signatur

class IntlRuleBasedBreakIterator extends IntlBreakIterator implements Traversable

Beschreibung

IntlRuleBasedBreakIterator ist eine Spezialisierung von IntlBreakIterator, die es ermöglicht, Textsegmentierungsregeln gemäß der ICU Rule-Based Break Iterator Syntax selbst zu definieren. Damit lassen sich Wort-, Zeilen-, Satz- oder beliebige andere Grenzen in Unicode-Texten nach eigenen Vorgaben bestimmen – unabhängig von den vordefinierten Iteratoren der ICU-Bibliothek.

Der Konstruktor akzeptiert entweder eine Regelzeichenkette im ICU-Regelformat oder binär vorkompilierte Regeln. Mit Regelzeichenketten können komplexe Muster definiert werden, z. B. um Tokens in einer domänenspezifischen Sprache, Codezeilen oder sprachspezifische Segmente zu erkennen. Vorkompilierte Binärregeln ermöglichen eine schnellere Initialisierung bei wiederholter Verwendung.

Nach der Initialisierung verhält sich IntlRuleBasedBreakIterator wie jeder andere IntlBreakIterator: Man weist ihm mit setText() einen Text zu und iteriert mit Methoden wie next(), previous(), first() oder last() über die gefundenen Grenzen. Der Iterator implementiert Traversable, sodass er auch in foreach-Schleifen eingesetzt werden kann.

Typische Anwendungsfälle sind mehrsprachige Anwendungen mit besonderen Trennregeln, Texteditoren, Parser oder Lernplattformen, die eine präzise, unicode-konforme Segmentierung benötigen, die über die Standarditerationen hinausgeht.

Parameter

Name Typ Default Beschreibung
$rules Pflicht string Regelzeichenkette im ICU-Regelformat oder binär vorkompilierte Regeln (wenn areCompiled auf true gesetzt ist). Die Regel-Syntax ist in der ICU-Dokumentation beschrieben.
$areCompiled bool false Gibt an, ob rules bereits vorkompilierte Binärregeln enthält (true) oder eine Quellregelzeichenkette (false). Vorkompilierte Regeln lassen sich mit getCompiledRules() erzeugen.

Beispiele

Einfache Wortsegmentierung mit benutzerdefinierten Regeln

<?php
// Einfache ICU-Regel: Trenne an Leerzeichen und Kommas
$rules = "\$word = [^\\p{Z}\\p{P}]+;" .
          "!!forward;" .
          "$word;" .
          "[\\p{Z}\\p{P}]+;";

try {
    $iter = new IntlRuleBasedBreakIterator($rules);
    $iter->setText('Hallo, Welt! Guten Tag.');

    $segments = [];
    $start = $iter->first();
    $end   = $iter->next();

    while ($end !== IntlBreakIterator::DONE) {
        $segments[] = substr('Hallo, Welt! Guten Tag.', $start, $end - $start);
        $start = $end;
        $end   = $iter->next();
    }

    print_r($segments);
} catch (IntlException $e) {
    echo 'Fehler: ' . $e->getMessage();
}

Regeln vorkompilieren und wiederverwenden

<?php
// Regeln einmalig kompilieren und für spätere Verwendung speichern
$rules = "!!forward; [A-Za-z]+; [^A-Za-z]+;";

$iter = new IntlRuleBasedBreakIterator($rules, false);

// Kompilierte Binärregeln sichern (z. B. in Datei oder Cache)
$compiled = $iter->getCompiledRules();
file_put_contents('/tmp/break_rules.bin', $compiled);

// Später: vorkompilierte Regeln laden (schnellere Initialisierung)
$compiled = file_get_contents('/tmp/break_rules.bin');
$fastIter = new IntlRuleBasedBreakIterator($compiled, true);
$fastIter->setText('PHP8 rocks 100%!');

foreach ($fastIter as $pos => $boundary) {
    echo "Grenze bei Position: $boundary\n";
}

Regeln und Regeltext abrufen

<?php
$rules = "!!forward; [A-Z][a-z]*; [^A-Za-z]+;";
$iter  = new IntlRuleBasedBreakIterator($rules);

echo $iter->getRules();
!!forward; [A-Z][a-z]*; [^A-Za-z]+;

// Wichtig · Fallstricke

Regelkomplexität: Die ICU-Regelsyntax ist mächtig, aber fehleranfällig. Ungültige Regelzeichenketten führen zu einer IntlException oder setzen einen Fehler im intl.error_level-Kontext. Immer auf Fehler prüfen.

Performance: Das Parsen von Regelzeichenketten ist teuer. Bei häufiger Verwendung derselben Regeln empfiehlt es sich, vorkompilierte Regeln via getCompiledRules() zu cachen und mit areCompiled = true zu laden.

Zeichencodierung: Der übergebene Text muss UTF-8-kodiert sein. Anderenfalls kann es zu unerwarteten Segmentierungsergebnissen kommen.

Voraussetzung: Die PHP-Extension intl muss aktiviert sein (extension=intl in der php.ini).