Robert Hennig: preg_match_all findet 0 nicht

Hallo Leute,

ich habe eine Zeile die eine IP-Adresse enthält mit angehängter Port-Nummer.

192.168.0.4:300

Mit dem folgenden finde ich auch korrekt die IP-Adresse

preg_match_all("|(([0-9]{1,3}).{1}([0-9]{1,3}).{1}([0-9]{1,3}).{1}([0-9]{1,3}):([0-9]{1,4}))|U",$line,$regs)

Allerdings findet er beim Port nur noch die Zahl 3 und nicht 300 woran kann das liegen? Der Suchstring sieht an der Stelle doch auch nicht anderst aus als bei der IP-Adresse....

Liebe Grüße

Robert

  1. Hallo,

    ich habe eine Zeile die eine IP-Adresse enthält mit angehängter Port-Nummer.

    192.168.0.4:300

    Mit dem folgenden finde ich auch korrekt die IP-Adresse

    preg_match_all("|(([0-9]{1,3}).{1}([0-9]{1,3}).{1}([0-9]{1,3}).{1}([0-9]{1,3}):([0-9]{1,4}))|U",$line,$regs)

    Zwar habe ich in der oku von preg_match_all auch die | am Anfang und Ende der Pattern gefunden, aber keine Erklärung dafür. Hast Du eine Erklärung, was die ODER-Verknüpfungen dort sollen? Ich würde es so versuchen:

    $line = "192.168.0.4:300";

    preg_match_all("/(([0-9]{1,3}).{1}([0-9]{1,3}).{1}([0-9]{1,3}).{1}([0-9]{1,3}):([0-9]{1,4}))/",$line,$regs);

    Dann sollte sein:
    $regs[0][0] = 192.168.0.4:300
    und
    $regs[1][0] = 192.168.0.4:300
    $regs[1][1] = 192
    $regs[1][2] = 168
    $regs[1][3] = 0
    $regs[1][4] = 4
    $regs[1][5] = 300

    Ich kanns zur Zeit, mangels PHP, nicht testen.

    viele Grüße

    Axel

    1. Hallo Robert, Hallo Axel,

      preg_match_all("|(([0-9]{1,3}).{1}([0-9]{1,3}).{1}([0-9]{1,3}).{1}([0-9]{1,3}):([0-9]{1,4}))|U",$line,$regs)

      lass mal das 'U' weg, dann funktioniert es (mit dem U wird der ganze Ausdruck "ungierig" und holt sich so wenig Zeichen wie möglich).

      Zwar habe ich in der oku von preg_match_all auch die | am Anfang und Ende der Pattern gefunden, aber keine Erklärung dafür.

      du kannst als Begrenzungszeichen jedes beliebige Zeichen (außer alphanumerischen und dem Backslash) verwenden - also auch ein | (ob das natürlich Sinnvoll ist, sei dahingestellt :-))

      preg_match_all("/(([0-9]{1,3}).{1}([0-9]{1,3}).{1}([0-9]{1,3}).{1}([0-9]{1,3}):([0-9]{1,4}))/",$line,$regs);
      Dann sollte sein:

      [...]
      das kommt auch raus - was aber nicht an den Begrenzungszeichen sondern an dem U lag.

      Grüße aus Nürnberg
      Tobias

      --
      Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|