Start · Sprachen · PHP · Referenz · mb_ereg

mb_ereg

Funktion

Führt einen regulären Ausdrucksabgleich mit Multibyte-Zeichenunterstützung durch und gibt die Anzahl der Zeichen des übereinstimmenden Teilstrings zurück.

seit PHP 4.2.0 Kategorie: string

Signatur

mb_ereg(string $pattern, string $string, array &$regs = null): int|false

Beschreibung

mb_ereg() prüft, ob der Reguläre Ausdruck $pattern im String $string gefunden wird. Im Gegensatz zu preg_match() arbeitet diese Funktion mit der internen Multibyte-Zeichenkodierung und unterstützt damit Zeichensätze wie UTF-8, EUC-JP oder Shift_JIS korrekt, ohne dass spezielle Modifier notwendig sind.

Wird der optionale Parameter $regs übergeben, wird er als Array mit den gefundenen Übereinstimmungen befüllt: Index 0 enthält den gesamten übereinstimmenden String, Index 1 bis n enthalten die Treffer der einzelnen Capture-Gruppen. Stimmt kein Treffer überein, bleibt $regs unverändert.

Die aktive Zeichenkodierung kann mit mb_regex_encoding() gesetzt werden. Standardmäßig wird die interne Kodierung (mb_internal_encoding()) verwendet. Das Pattern nutzt die POSIX-Extended-Regex-Syntax (wie GNU regex), nicht die Perl-kompatible PCRE-Syntax.

Die Funktion ist besonders nützlich bei der Verarbeitung asiatischer Texte oder anderer Multibyte-Kodierungen, bei denen bytebasierte Regex-Funktionen wie ereg() (veraltet) oder sogar preg_match() ohne den u-Modifier falsche Ergebnisse liefern könnten.

Parameter

Name Typ Default Beschreibung
$pattern Pflicht string Der reguläre Ausdruck in POSIX-Extended-Syntax (kein PCRE). Wird in der aktuellen mb_regex_encoding() interpretiert.
$string Pflicht string Der zu durchsuchende Eingabe-String, der in der aktiven Multibyte-Kodierung vorliegen sollte.
$regs array null Wird per Referenz übergeben und nach dem Aufruf mit den gefundenen Teilstrings befüllt. Index 0 ist der vollständige Treffer, ab Index 1 folgen die Capture-Gruppen.

Rückgabewert

Typ
int|false
Beschreibung
Gibt die Anzahl der Bytes (nicht Zeichen) des gesamten übereinstimmenden Strings zurück, wenn ein Treffer gefunden wurde. Liefert false, wenn kein Treffer gefunden wurde oder ein Fehler aufgetreten ist. Achtung: Wenn der übereinstimmende String leer ist, wird 0 zurückgegeben — daher immer mit === false auf Fehlschlag prüfen, nicht mit == false.

Beispiele

Einfacher Multibyte-Regex-Abgleich mit Capture-Gruppe

<?php
mb_regex_encoding('UTF-8');

$string = 'Hallo Welt, schöne neue Welt!';
$pattern = '(Welt)';

$result = mb_ereg($pattern, $string, $matches);

if ($result !== false) {
    echo 'Treffer gefunden: ' . $matches[0] . PHP_EOL;
    echo 'Capture-Gruppe 1: ' . $matches[1] . PHP_EOL;
    echo 'Byte-Länge des Treffers: ' . $result . PHP_EOL;
} else {
    echo 'Kein Treffer.' . PHP_EOL;
}
Treffer gefunden: Welt Capture-Gruppe 1: Welt Byte-Länge des Treffers: 4

Japanische Zeichen mit UTF-8-Kodierung prüfen

<?php
mb_regex_encoding('UTF-8');

$string = 'これはテストです。';
$pattern = 'テスト';

if (mb_ereg($pattern, $string) !== false) {
    echo 'Das Wort "テスト" wurde gefunden.' . PHP_EOL;
} else {
    echo 'Kein Treffer.' . PHP_EOL;
}

// Mit Gruppen: Zahlen in gemischtem Text finden
$text = '注文番号: 12345';
if (mb_ereg('([0-9]+)', $text, $regs) !== false) {
    echo 'Gefundene Zahl: ' . $regs[1] . PHP_EOL;
}
Das Wort "テスト" wurde gefunden. Gefundene Zahl: 12345

Korrekte Prüfung auf false vs. leeren Treffer

<?php
mb_regex_encoding('UTF-8');

$string = 'abc';

// Pattern, das einen leeren String matchen kann
$result = mb_ereg('x*', $string, $matches);

// Wichtig: === false verwenden, nicht == false (da 0 auch falsy ist)
if ($result === false) {
    echo 'Kein Treffer.' . PHP_EOL;
} else {
    echo 'Treffer (Byte-Länge: ' . $result . '): "' . $matches[0] . '"' . PHP_EOL;
}
Treffer (Byte-Länge: 0): ""

// Wichtig · Fallstricke

Deprecation: Ab PHP 8.0 ist mb_ereg() offiziell nicht mehr als veraltet markiert, jedoch wird in vielen Projekten der Wechsel zu preg_match() mit dem u-Modifier (/pattern/u) empfohlen, da PCRE-Funktionen weiter verbreitet, besser dokumentiert und leistungsfähiger sind.

Rückgabewert-Falle: Die Funktion gibt bei einem leeren Treffer 0 zurück, was im booleschen Kontext false entspricht. Deshalb immer mit striktem Vergleich === false auf Fehlschlag testen.

Syntax-Unterschied: Das Pattern verwendet POSIX-Extended-Regex, nicht PCRE. Trennzeichen wie / werden nicht benötigt, Modifier wie i oder s werden stattdessen über mb_regex_set_options() gesetzt.

Kodierung: Es wird dringend empfohlen, vor dem Aufruf die Kodierung explizit mit mb_regex_encoding('UTF-8') zu setzen, um unerwartetes Verhalten durch abweichende globale Einstellungen zu vermeiden.