maettig.com

Thiemos Archiv

Mich hat interessiert, ob sich die Webbrowser in ihrer Unterstützung für reguläre Ausdrücke unterscheiden. Werden bestimmte, erweiterte Regex-Suchmuster von manchen älteren Webbrowsern möglicherweise nicht verstanden? Die kurze Antwort lautet: Nein. Die Regex-Engines aller Webbrowser, auch der älteren, scheinen in puncto Funktionsumfang sehr konsistent zu sein.

Zur Erhebung meiner Daten habe ich ein kleines Script auf einer meiner Websites platziert, das die Webbrowser der Besucher für ein paar Mini-Tests missbraucht und für jeden regulären Ausdruck protokolliert, ob er erfolgreich war oder nicht oder gar eine Exception auslöste. In der Auswertung tauchen unter anderem Internet Explorer ab Version 6 auf, Firefox ab Version 2, Safari ab Version 3.1, Google Chrome ab Version 3 und (natürlich) Opera ab Version 10.

Meine Ergebnisse:

  • Nicht-matchende Klammerausdrücke (non matching parenthesis) werden von allen Webbrowsern verstanden. Zum Beispiel bedeutet (?:a)(b), dass der Inhalt der zweiten Klammer wieder als $1 in der Ersetzung verwendet werden kann. Die erste Klammer wird durch den Vorsatz ?: davon ausgeschlossen.
  • Die Kurzformen \s (spaces) und \w (words) für Zeichenklassen (character class) werden von allen Webbrowsern verstanden. Noch nicht getestet habe ich allerdings, ob alle Browser die selben Zeichen (Zeilenumbrüche, Umlaute) als zu diesen Klassen zugehörig betrachten.
  • Lookaheads wie zum Beispiel a(?=b) und sogar negative Lookaheads wie a(?!b) werden überraschenderweise von allen Webbrowsern verstanden, selbst von den ältesten in meiner Erhebung.
  • Nicht unterstützt werden Lookbehinds wie (?<=c)b sowie Inline-Modifikatoren wie (?i). Nur Konqueror fällt aus dem Rahmen, dort funktioniert beides.

Ein interessantes Detail am Rande: Der Googlebot hat an meiner Erhebung teilgenommen und brav das JavaScript mit seinen regulären Ausdrücken ausgeführt. Merkwürdigerweise sind die Fehlermeldungen, die er für die letzten beiden Tests ausspuckt, nicht identisch zu den Meldungen vom Chrome-Browser sondern zu denen vom Safari. Vielleicht hat aber auch nur jemand die Signatur seines Safaris kreativ maskiert.

Ergänzung: Der Modifikator /s ist in JavaScript nicht vorgesehen und funktioniert in den meisten Webbrowsern auch nicht, außer in Google Chrome und Safari. Alle Zeichenklassen einschließlich der invertierten (\D, \S und \W) funktionieren überall gleich. Umlaute sind in \w nie eingeschlossen, diese muss man immer getrennt notieren.
Thiemo
Ich habe ein paar weitere Tests laufen lassen. Ergebnisse:

Zeichenklassen in Zeichenklassen wie z.B. [^\d] funktionieren in allen Webbrowsern bis hinunter zu IE6, egal mit welchem Kürzel und egal was man sonst noch in die eckigen Klammern packt.

Ein Bindestrich am Ende einer Zeichenklasse wie [^1-] (Zeichenklasse mit allen Zeichen außer der Eins und dem Bindestrich) wird einheitlich als Bindestrich interpretiert und nicht als Zeichenbereich. Der besseren Lesbarkeit wegen sollte man trotzdem [^1\-] schreiben, genauso wie man [^\[] schreiben sollte und nicht [^[]. Werkzeuge wie JSLint fordern das auch ganz zu Recht.

Optionale Teilausdrücke wie in /a|b/ funktionieren auch ohne runde Klammern in allen Webbrowsern.

Selbstreferenzen wie in (.)\1 (finde ein beliebiges Zeichen gefolgt vom gleichen Zeichen) funktionieren ebenfalls in allen Webbrowsern.
Thiemo
Probleme gibt es, wenn man die Kürzel $&, $` oder $' verwenden will. Die funktionieren erst ab Chrome 14 zuverlässig, ab Firefox 3.0 und ab Safari 5.1, sind aber problemlos in Opera und allen IE-Versionen.
Thiemo

Kommentare zu diesem Beitrag können per E-Mail an den Autor gesandt werden.

[ ← Zurück zur Übersicht ]

Impressum & Datenschutz