PHP Suche und Extraktion von Teilstrings mit regulären Ausdruck

ryk

BAZINGA!
ID: 66395
L
4 Mai 2006
3.313
115
Hallo,

ich hab ein String a la
PHP:
$string = " hallo_999.blubb 1 hasdfasdf9.blubb 8"
und ein Muster definiert
PHP:
$muster = "/^[[:space:]]{1}[a-zA-Z0-9._-]+[[:space:]]{1}[0-9]{1}$/";
Es sollen also Zeichenfolgen gefunden werden die genau ein Leerzeichen haben, gefolgt von 1 bis * Zeichen, dann wieder genau ein Leerzeichen und eine Zahl. Der Suchstring enthält genau zwei solcher Muster, nämlich " hallo_999.blubb 1" und " hasdfasdf9.blubb 8".
Ich möchte nun alle Teilstrings (im Beispiel die genannten zwei) die den Muster entsprechen jeweils in ein Arrayfeld schreiben, sodass ich am Ende des Tages ein Array mit zwei Einträgen mit den jeweiligen Teilsstring habe. Finde nur keine passende PHP Funktion dafür. In Javascript hatte ich das mal mit Search() umgesetzt. Weiß jemand wie man das in PHP umsetzen kann?

Grüße
ryk
 

Hatte ich bereits schon versucht. Das Array hat nur die Länge 1 und es wird nicht ausgegeben.

PHP:
$string = " hallo_999.blubb 1 hasdfasdf9.blubb 8";
$muster = "/^[[:space:]]{1}[a-zA-Z0-9._-]+[[:space:]]{1}[0-9]{1}$/";

preg_match_all($muster, $string, $a);

echo "Länge: " + count($a);
$i = -1;
foreach ($a as $val) {
    echo $val[++$i];
}

Einzige Ausgabe: Länge: 1
 
Mach mal
PHP:
print_r($a);
Vermutlich ein Fehler in deinem regulären Ausdruck, wenn du nicht die gewünschte Ausgabe kriegst.
 
Okay, danke. War wirklich ein Fehler im regulären Ausdruck. Das ^ musste raus und das ganze noch mit () umschmücken dann funktionierts :)

PHP:
$muster = "/([[:space:]]{1}[a-zA-Z0-9._-]+[[:space:]]{1}[0-9]{1})$/";

Mach mal
PHP:
print_r($a);
Vermutlich ein Fehler in deinem regulären Ausdruck, wenn du nicht die gewünschte Ausgabe kriegst.
 
Ich würde das $ auch noch rausnehmen, sonst werden doch nur Ausdrücke am Ende des Strings gefunden.

Ansonsten noch: {1} ist irgendwo unnötig. Ohne diese Angabe wird sowieso 1x angenommen. Und \s = [[:space:]] bzw. \d = [0-9] sowie /[a-zA-Z]/ = /[a-z]/i. So ist der RegEx vielleicht etwas lesbarer:
Code:
/(\s[a-z0-9._-]+\s\d)/i
Und da Du ja an dem ganzen Match interessiert bist, kannst Du eigentlich auch die Klammern weglassen, dann dürfte jeweils die einzige Rückgabe genau der gesuchte Teilstring sein.
 
  • Like
Reaktionen: ryk