HOWTO · JavaScript

JavaScript-Alternativen zu PHPs preg_match()

In diesem Artikel erfahren wir, was der Zweck der Funktion preg_match ist und wie die gleiche Funktionalität in JavaScript mit einem Beispiel implementiert werden kann.

Auf dieser Seite

Wer nach JavaScript und preg_match() sucht, möchte meist eine Zeichenfolge mit einem regulären Ausdruck prüfen oder den passenden Text abrufen. JavaScript hat keine eingebaute Funktion namens preg_match(); verwenden Sie RegExp.prototype.test() für ein Ja-oder-Nein-Ergebnis und String.prototype.match(), wenn Sie Details zum Treffer benötigen. Welche Methode passt, hängt davon ab, was Ihr Code anschließend tun soll.

PHPs preg_match() verstehen

PHPs preg_match() übernimmt ein Muster und eine Zeichenfolge, in der gesucht wird. Optional kann die Funktion Trefferinformationen in einem dritten Argument ablegen: preg_match($pattern, $subject, $matches).

Der Rückgabewert ist nicht einfach ein boolescher Wert: Bei einem Treffer lautet er 1, bei keinem Treffer 0 und im Fehlerfall false. Das optionale Argument $matches enthält bei einem Treffer den erfassten Text. Dieser Unterschied ist wichtig, wenn Sie eine Bedingung übertragen: JavaScripts test() gibt einen booleschen Wert zurück, während match() Trefferinformationen oder null liefert.

Ein JavaScript-Gegenstück auswählen: test() oder match()

Eine direkte JavaScript-Funktion preg_match() gibt es nicht. Sowohl test() als auch match() arbeiten mit regulären Ausdrücken in JavaScript, beantworten aber unterschiedliche Fragen. Verwenden Sie test(), wenn der nachfolgende Code nur wissen muss, ob ein Muster vorkommt. Verwenden Sie match(), wenn er den passenden Teilstring, Erfassungsgruppen oder die Position des Treffers benötigt. Für eine Ja-oder-Nein-Prüfung wie in PHP eignet sich test(); für die optionalen Daten aus $matches verwenden Sie match() und berücksichtigen dessen abweichenden Rückgabewert.

test() für eine Ja-oder-Nein-Prüfung verwenden

Rufen Sie test() auf einem regulären Ausdruck auf und übergeben Sie die zu prüfende Zeichenfolge. Die Methode gibt true zurück, wenn der Ausdruck irgendwo in der Zeichenfolge zutrifft, andernfalls false. Dieses Beispiel prüft, ob der Text das Wort hello enthält:

Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

const pattern = /hello/;
const text = "hello world";
console.log(pattern.test(text));
true

Im bereitgestellten Lauf gab das Beispiel true aus. Für das gegenteilige Ergebnis können Sie eine Zeichenfolge ohne hello verwenden; entsprechend der JavaScript-Semantik von test() ergibt der Aufruf dann false. Das eignet sich für eine Prüfbedingung. Das Muster selbst muss jedoch das vollständige Format ausdrücken, das Sie validieren möchten. Ein Muster, das lediglich Ziffern findet, belegt beispielsweise nicht, dass die gesamte Eingabe nur aus Ziffern besteht. Verwenden Sie Anker, wenn die ganze Zeichenfolge dem Muster entsprechen muss.

Mit match() Treffer abrufen

Rufen Sie match() auf der Zeichenfolge auf und übergeben Sie einen regulären Ausdruck. Bei einem Ausdruck ohne das Flag g liefert ein Treffer ein Array, dessen erstes Element der vollständige Treffer ist. Erfassungsgruppen und Eigenschaften wie index liefern zusätzliche Informationen. Wird kein Treffer gefunden, ist das Ergebnis null. Prüfen Sie daher auf null, bevor Sie auf Array-Eigenschaften zugreifen.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

const text = "Order 42 is ready";
const result = text.match(/Order (\d+)/);

if (result !== null) {
  console.log(result[0]);
  console.log(result[1]);
  console.log(result.index);
} else {
console.log("No match");
}
Order 42
42
0

Im bereitgestellten Lauf gab das Beispiel den vollständigen Treffer Order 42, die erfassten Ziffern 42 und den Startindex 0 aus. Die Bezeichnung Order bleibt im unveränderten Beispiel auf Englisch. Wenn das Muster nicht zutrifft, ist result gleich null und der alternative Zweig wird ausgeführt. Anders als PHPs optionales Argument $matches liefert JavaScript das Ergebnis direkt aus dem Methodenaufruf zurück.

Flags und häufige Stolperfallen

Flags für reguläre Ausdrücke ändern das Suchverhalten in JavaScript. Standardmäßig wird zwischen Groß- und Kleinschreibung unterschieden; mit i, etwa in /hello/i, wird sie ignoriert. Das Flag g verändert die Form des Ergebnisses von match(): text.match(/\d+/g) gibt ein Array mit allen gefundenen Ziffernfolgen zurück oder null, wenn es keine gibt. Bei dieser globalen Suche enthält das Ergebnis weder den index für jeden Treffer noch die Erfassungsgruppen, die ein Aufruf von match() ohne g bereitstellt. Verwenden Sie einen nicht globalen Ausdruck, wenn Sie die Erfassungsgruppen und die Position eines bestimmten Treffers benötigen.

Seien Sie vorsichtig, wenn Sie einen regulären Ausdruck mit dem Flag g oder y zusammen mit test() wiederverwenden: Diese Ausdrücke speichern eine Position in lastIndex. Bei wiederholten Aufrufen kann sich das Ergebnis daher abwechseln, während die Suchposition weiterwandert. Für eine einfache, unabhängige Ja-oder-Nein-Prüfung lassen Sie diese zustandsbehafteten Flags weg oder setzen Sie lastIndex vor jeder Prüfung zurück. Beachten Sie außerdem, dass Zeichen wie ., * und ? in einem Muster eine besondere Bedeutung haben. Wenn Sie das jeweilige Zeichen wörtlich meinen, maskieren Sie es mit einem Backslash. Verwenden Sie Anker wie ^ und $, wenn die gesamte Zeichenfolge statt nur eines Teilstrings dem Muster entsprechen muss.