[RegEx] Gruppenfehler oder Reihenfolge falsch

Parantatatam

mag Cookies & Kekse
Hallo Tutorianer,

mein momentanes Anliegen ist, dass ich versuche nun mehr endlich eine anwendbare Lösung für einen User-Agent-String-Parser zu entwickeln. Dabei habe ich jetzt zwei Ansätze, welche beide funktionieren, wobei einer davon doch eher unnötig kompliziert ist, wie mir heute auffiel. Deshalb habe ich mich jetzt zu einer Variante II bemüht, welche allein mit regulären Ausdrücken arbeitet. Und da liegt auch schon das Problem, welches vermutlich nur durch das Pattern und ein Beispiel zu erklären ist:
Code:
/(windows nt|windows|win|syllable|macintosh|mac os x|iphone os|amigaos|mozilla|firefox|gecko)((\/[v]?|[ ]+)([0-9]+((_[0-9]+)*|(\.[0-9]+)*)))?/i
Was dann beispielsweise das hier durchsuchen soll:
Code:
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10
Und am Ende soll eben herauskommen:
Code:
Array (
  [0] => Array (
    [0] => Mozilla,
    [1] => 5.0,
  ),
  [1] => Array (
    [0] => Macintosh,
    [1] => ,
  ),
  [2] => Array (
    [0] => Mac OS X,
    [1] => 10.6,
  ),
  [3] => Array (
    [0] => Gecko,
    [1] => 20100914,
  ),
  [4] => Array (
    [0] => Firefox,
    [1] => 3.6.10,
  ),
)
Jetzt zum Problem: er findet eine Versionsnummer im Format a_b_c, aber nicht im Format a.b.c
Wenn ich jedoch die Reihenfolge im Pattern ändere, also, dass der Unterstrich nach der Variante mit dem Punkt notiert wird, dann funktioniert die Variante mit Punkt, allerdings nicht die mit dem Unterstrich. Ich frage mich nur warum das so ist und sehe keine Möglichkeit das zu korrigieren, da diese beiden Varianten bereits gruppiert sind.

[offtopic]Wie kann man Text in Code- oder Highlight-Tags farbig hervorheben?[/offtopic]
 
Hallo crack,

kannst Du mal eine Ausgabe deines Pattern posten?

Teste es mal bitte statt
Code:
([0-9]+((_[0-9]+)*|(\.[0-9]+)*))
mit
Code:
([0-9]+(((_[0-9]+)*)|((\.[0-9]+)*)))
oder
Code:
([0-9]+((_[0-9]+)|(\.[0-9]+))*)

Gruß
 
Zurück