Ankündigung

Einklappen
Keine Ankündigung bisher.

Regex-Problem trotz ungreedy

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Regex-Problem trotz ungreedy

    Hallo allerseits,

    ich habe ein Problem mit der Anwendung von regulären Ausdrücken mit PHP.

    Mein zu durchsuchender Text sieht ungefähr so aus:
    Code:
    Filmtitel
    ...
    Kinostart: 2010
    ...
    Filmtitel
    ...
    Kinostart: 2010
    ...
    Filmtitel
    ...
    Kinostart: 30.12.2010
    ...
    Filmtitel
    ...
    Kinostart: 2010
    Ich suche den Textteil der Form:
    Code:
    Filmtitel
    ...
    Kinostart: 30.12.2010
    D.h. ich will den Filmtitel .... Kinostartdatum-Block nur haben wenn ein genaues Datum feststeht.

    Wenn ich das mit einem per U-Operator ungreedy gemachten Regulären Ausdruck dürchführe, würde ich aber bei obigem Beispiel folgendes Ergebnis erhalten:
    Code:
    Filmtitel
    ...
    Kinostart: 2010
    ...
    Filmtitel
    ...
    Kinostart: 2010
    ...
    Filmtitel
    ...
    Kinostart: 30.12.2010
    D.h. sobald die preg_match_all-Funktion "Filmtitel" gefunden hat sammelt sie alles ein, bis ein korrektes Datum kommt. Ich möchte aber nur einen direkt zusammenhängenden "Filmstarts ... Kinostart"-Block haben.

    Wie kann ich das hinbekommen?

    Viele Grüße, Juuro
    [URL="http://blog.twoseb.de"]illumination der wirklichkeit[/URL]

  • #2
    lass dein preg-match wie es ist, und werte den "Datumsteil" in einem 2ten Schritt aus ...(ist ja recht einfach, da es nach String ausschaut, mach einfach nen strlen() Vergleich mit "größer als" 15 (wenn ich richtig gezählt habe, dann ist das "Kinostart: jahr") - sollten auch Angaben der Form monat / Jahr vorkommen, dann vergleiche auf "größer als" 18

    alternativ müsstest du deine Datumsregel so anpassen, dass sie auf ein reguläres Datum prüft ...

    Kannst du vielleicht dein Textbeispiel, das gewünschte Ergebnis und das was du momentan erhältst mal bitte so anpassen, dass man die einzelnen Filmtitel auseinanderhalten kann. Ich seh momentan noch die Gefahr, dass du eventuell einen Filmtitel ganz überspringst, wenn überhaupt kein Startermin angegeben ist - oder kannst du diesen Fall ausschließen?
    "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

    Kommentar


    • #3
      Zitat von Juuro Beitrag anzeigen
      ich habe ein Problem mit der Anwendung von regulären Ausdrücken mit PHP.
      Dann zeig uns wenigstens, welchen Ausdruck du bisher hast, und beschreibe, was du dir dabei gedacht hast.
      [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

      Kommentar


      • #4
        Vielen Dank für eure Antworten!

        Zitat von eagle275 Beitrag anzeigen
        lass dein preg-match wie es ist, und werte den "Datumsteil" in einem 2ten Schritt aus ...(ist ja recht einfach, da es nach String ausschaut, mach einfach nen strlen() Vergleich mit "größer als" 15 (wenn ich richtig gezählt habe, dann ist das "Kinostart: jahr") - sollten auch Angaben der Form monat / Jahr vorkommen, dann vergleiche auf "größer als" 18
        Wie meinst du das? Ich habe ja moementan das Problem, dass ich als Ergebnis sowas erhalte:

        Code:
        Filmtitel 1
        ...
        Kinostart: 2010
        ...
        Filmtitel 2
        ...
        Kinostart: 2010
        ...
        Filmtitel 3
        ...
        Kinostart: 30.12.2010
        Wobei aber dann im Ergebnis Filmtitel 1 und Kinostart 30.12.2010 zusammengehören. Was natürlich total falsch ist. Darum verstehe ich nicht was mir das abzählen bringt, denn ich müsste ja dann auch noch rückwirkend rausfinden welches der richtige zugehörige Filmtitel ist.

        Zitat von eagle275 Beitrag anzeigen
        alternativ müsstest du deine Datumsregel so anpassen, dass sie auf ein reguläres Datum prüft ...
        Was meinst du mit regulärem Datum? Ich prüfe ja auf ein Datum der Form dd.mm.YY

        Zitat von eagle275 Beitrag anzeigen
        Kannst du vielleicht dein Textbeispiel, das gewünschte Ergebnis und das was du momentan erhältst mal bitte so anpassen, dass man die einzelnen Filmtitel auseinanderhalten kann. Ich seh momentan noch die Gefahr, dass du eventuell einen Filmtitel ganz überspringst, wenn überhaupt kein Startermin angegeben ist - oder kannst du diesen Fall ausschließen?
        Was meinst du? Siehe meine momentane Regex... Kein Starttermin gibt es nicht.

        Zitat von ChrisB Beitrag anzeigen
        Dann zeig uns wenigstens, welchen Ausdruck du bisher hast, und beschreibe, was du dir dabei gedacht hast.
        Mein Ausdruck sieht bisher so aus:
        PHP-Code:
        '/\<a href\=\'\/kritiken\/.*\.html\'\>(.*)\<\/a\>\<\/h2\>.*Kinostart\:\s*([0-9]{2})\.([0-9]{2})\.([0-9]{4})/U' 
        Das Problem ist, dass in dem zu durchsuchenden String zwischen dem "</h2>" und dem "Kinostart" ganz viel Kram steht der mir total egal ist. Aber da kann halt jegliches Zeichen vorkommen. Darum hält es die Regex halt auch nicht auf wenn da nochmal "<a href..." vorkommt. Ich habe mir gestern noch gedacht, dass ich ja dann irgendwie innerhalb dem .* das Wort "kritiken" ausschließen kann. Aber das habe ich leider nicht hinbekommen.
        [URL="http://blog.twoseb.de"]illumination der wirklichkeit[/URL]

        Kommentar


        • #5
          also mal so ins Blaue .. du musst mit Hilfe von preg_match die einzelnen Terme zusammenfassen - da war doch irgendwas mit Klammern - dann kannst du einfach diejenigen Terme auswählen, die du haben willst.

          preg_match unterstützt einen dritten Parameter, dort übergibst du ein leeres Array und preg_match liefert dir die gewünschten Terme direkt als array-Einträge. Guckst du hier : http://de.php.net/manual/de/function.preg-match.php

          sieh dir besonders die Usercomments an, dort wird auch das Zusammenfassen von Gruppen mehrfach erklärt

          Mein "Stringlänge des Datums mit 15 bzw 18 vergleichen bezog sich natürlich darauf, da ich irgendwie erwartet hatte, dass du den ursprünglichen langen Text gleich durch Termzusammenfassung in ein array gesplittet hast, wo du dann nur den jeweiligen Datumsteil dieser Prüfung unterziehen müsstest.

          Aber mal so nebenbei ..
          ich prüfe ja auf ein Datum der Form dd.mm.YY
          das scheint aber noch daneben zu gehen - denn wenn dieser Test richtig funktioniert, dann bekommst du darüber auch nur diejenigen Textabschnitte, die auch wirklich ein echtes Datum enthalten mithin dürften in deiner Lösung keine einzelnen Zeilen "Kinostart: 2010" mehr vorkommen. Da müsstest du wohl nochmal ein wenig am regulären Ausdruck basteln
          "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

          Kommentar


          • #6
            Ich schließe mich aegle275 an, du solltest etwas mehr Klammern verwenden und den 3. Parameter nutzen. Klammere zum Beispiel .* vor dem "Kinostart". Es ist dann zwar noch in der Ergebnismenge enthalten, allerdings in einem separatem Array-Feld.
            PHP online testen, zum Beispiel: md5, base64_decode, preg_match, urldecode und viele weitere...

            Kommentar

            Lädt...
            X