Frage zu regulären Ausdrücken

Nord-Süd-Richtung

Erfahrenes Mitglied
Hi

ich habe mich in letzter Zeit öfters mit regulären Ausdrücken beschäftigt und schätze mich mittlerweile recht fit ein. Nur habe ich eine Frage zu einer bestimmten Syntax, die zumindest bei nicht zu funktionieren scheint:
PHP:
$string  = "101";
$pattern = "/(\d)\d\1/";
preg_match_all($pattern,$string,$matches);
Meiner Meinung sollte es so ablaufen. Es wird eine Zahl (\d) gesucht. Anschließend muss eine weitere Zahl folgen(\d) und dann noch die Zahl, die ganz zu Anfang gefunden wurde (\1). Allerdings scheint das \1 nicht zu funktionieren, jedenfalls enthält "matches" keinen "match" :-/
 
Versuch es mal, nachdem du das Pattern in einfache Anführungszeichen gesetzt hast. Ich habe es gerade mit dem RegEx-Tester ausprobiert und es funktioniert ohne Probleme.

Code-Beispiel:
PHP:
<?php 
error_reporting(E_ALL); 

// Text bzw. String der durchsucht werden soll  
$string = <<<EOF 
101 
EOF; 

// das Suchmuster mit Delimiter und Modifer (falls vorhanden)  
$pattern = '/(\d)\d\1/'; 

// RegEx mit preg_match_all() auswerten  
preg_match_all($pattern, $string, $array); 

// formatierte Ausgabe  
echo '<pre>', print_r($array, true), '</pre>'; 
?>
 
Folgende Varianten funktionieren:

Code:
$pattern = '/(\d)\d\1/ ';
$pattern = "/(\d)\d \\1/";

Dein Versuch scheitert wie erwähnt an den doppelten Anführungzeichen, weil dort der String vorher durch PHP ausgwertet wird.
Die Escape-Sequenz wird dir dort das ASCII-Zeichen mit dem Wert 1 liefern(irgendein Steuerzeichen).

Kurzer Test:
Code:
$string  = "10".chr(1);
$pattern = "/(\d)\d\1/";
preg_match_all($pattern,$string,$matches);  
print_r($matches);
 
Ich würde bei Zeichenketten, insofern es nicht unbedingt notwendig ist, immer einfache Anführungszeichen nutzen, denn in diesen wird der Inhalt nicht interpretiert, was im Endeffekt auch noch die Auslastung senkt. Zwar nur gering, aber immerhin.
 
Zurück