regular expression

  • Hallo zusammen,
    ich schaffe es einfach nicht mit den regular expressions umzugehen. Und würde mich über Hilfe sehr freuen.


    Ich habe folgenden Code


    PHP
    1. preg_match_all("|<h1>(.*?)</h1>|", $bericht, $a);
    2. echo "Koordinaten sind: {$a[1][0]}";


    Das ist erstmal schon ganz gut.
    Die Ausgabe hier ist:

    Code
    1. Koordianten sind: Bericht von Gloyonaid (333:183:G)


    Was ich aber nun möchte ist die Reinfolge aus Zahlen und dem Buchstaben mit den Doppelpunkten.
    Diese steht aber nicht immer in Klammern! Jedoch immer zwischen den Tags H1!


    Ich habe es schon versucht mit

    PHP
    1. preg_match_all("|<h1>([0-9]{3}):([0-9]{3}):([A-Z]{1})</h1>|", $bericht, $a);


    Das ich da scheinbar einen Denkfehler habe ist fast sehr offensichtlich.
    Auf jeden Fall wird es mit einer Fehlermeldung bestätigt... :/
    Jedoch komme ich nicht darauf.
    Und eh ich mir jetzt alle Haare ausraufe, frage ich lieber um Hilfe.


    Vielen Dank schon mal.
    Alles liebe
    thilda

  • Klar könnte ich das so machen.
    Ich finde es aber nicht kompliziert es auf die weise zu machen wie ich es vorhabe.
    Es bedeutet einfach ein paar Zeilen weniger Code.


    Das einzig komplizierte daran ist, derzeit für mich, die Umsetzung. Weil ich mit Regular Expressions einfach nie wirklich klar gekommen bin. :(

  • Anhand deines Beispiels sieht es in http://www.regexr.com/ eigtl. alles gut aus. Aber sicher, dass die Koordinaten immer 3-stellig sind? [0-9]{1,3} oder \d+ wäre da wohl angebrachter.


    Getestet mit $bericht="Bericht von Gloyonaid (333:183:G)"


    Ergebnis:
    3 capturing groups:
    group 1: ([0-9]{3})
    group 2: ([0-9]{3})
    group 3: ([A-Z]{1})



    Gib doch mal bitte einen richtigen Kontext. (Einen größeren Ausschnitt aus $bericht)


    Außerdem, verwende bitte keine RegEx-Zeichen als Begrenzung, das ist doch etwas verwirrend beim drüberschauen ;)
    Um nur mal sicher zu gehen, lass dir mal $a ausgeben mit print_r e.ä., das Ergebnis unter [1][0] ist der gesamte match, nicht die Gruppen die du haben willst.


    //P.S. jetzt seh ichs erst. Das kommt von, wenn man kein ordentliches Beispiel postet. Die Koordinaten sind garantiert nicht direkt hinter <h1>. Auch fehlt die schließende Klammer hinter den Koordinaten (da du sofort nach </h1> suchst).
    Mach mal draus

    Code
    1. [COLOR=#000000][COLOR=#DD0000]~<h1>.+\((\d+)[/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000]:([/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000]\d+)[/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000]:([/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000]\w+)\).*</h1>~[/COLOR][/COLOR]

    , dann sollte es ausch fruchten. FYI, reguläre Ausdrücke liest man nicht, man untersucht sie *g* (zugegeben, dieses Beispiel war aber noch lesbar genug...)
    Falls "<" ein unerlaubtes Zeichen im Spielernamen ist wäre

    Code
    1. [COLOR=#000000][COLOR=#DD0000]~<h1>[^<]+\((\d+)[/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000]:([/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000]\d+)[/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000]:([/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000]\w+)[/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000]\)[/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000].*[/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000]</h1>~[/COLOR][/COLOR]

    besser. (.* hinter der Klammer sicherheitshalber hinzugefügt, falls da noch leerzeichen o.ä. stehen würden)


    Getestet mit: "<h1>Bericht von Gloyonaid (333:183:G) </h1>"


    Warum denn so kompliziert?


    Teile das mit explode und Anhand des Leerzeichens in ein Array und das letzte Element des Array enthält dann deine gesuchten Koordinaten.
    Anschliessend evtl. Klammern entfernen.


    Weil du den Kontext nicht verstanden hast. Das ist wohl eine Scrapping Aufgabe, da kommst du ohne vorherige Suche / Eingrenzung nicht weiter mit nem stinkigen Explode alleine. Außer du meinst den Ausdruck so zu lassen wie er ist und nachbearbeiten, da kann man aber das gleich anders macen.
    Aber ich würde auch eher empfehlen, ein Format zu definieren wie so ein Bericht eigtl. aussieht um einmal richtig zu parsen - damit hat sichs dann auch (sieht nach nem Browser-Game aus, die Formatierung ist also mehr oder minder fest)... Sprich, Zeilenweise parsen wäre imo der einfachere Weg. (Data -> Model -> be happy & done)

  • Hey Grevas,
    ich hab jetzt mal dein 1.bsp übernommen und es spielt soweit.
    Für mich ist jetzt die Frage:
    ist es allg ausgeschlossen die 3 teile der Koordinaten in einem zu bekommen?
    Weil dann weiß ich auch wo noch ein Denkfehler bei mir lag. Und Leerzeichen gibt es keine weiteren. Und auch sind es immer jeweils drei Zahlen und ein Buchstabe.

  • Code
    1. [COLOR=#000000][COLOR=#DD0000]~<h1>[^<]+\((\d+[/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000]:[/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000]\d+[/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000]:[/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000]\w+)[/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000]\)[/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000].*[/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000]</h1>~[/COLOR][/COLOR]


    Wäre dann halt match[1] = 333:183:G (da du die erste Gruppe auswählen musst), bin mir nicht ganz sicher bei dem index. Musst nur deine Gruppen so wählen wie du die haben willst.