StringRegExp treibt mich in den Wahnsinn

  • Hi,
    ich versuche einen Teil aus einer URL zu filter.
    Mit StringRegExp möchte ich nur diesen String erhalten: "diese-buchstaben-zahlen12-und-zeichen".

    Am Ende dürfen kein "/" oder andere Zeichen vorhanden sein.
    Das wollte ich eigentlich mit diesem Patter verhindern "(?!\/)".

    Aber irgendwie mache ich wohl etwas gewaltig falsch.

    Könntet ihr euch mein Beispiel bitte ansehen?

    [autoit]


    Global $Test[4]
    Global $Beispiel[4]

    [/autoit][autoit][/autoit][autoit]

    $Beispiel[1] = "http://beispiel.de/test/2011/12/diese-buchstaben-zahlen12-und-zeichen"
    $Beispiel[2] = "http://beispiel.de/test/2011/12/diese-buchstaben-zahlen12-und-zeichen/"
    $Beispiel[3] = "http://beispiel.de/test/2011/12/diese-buchstaben-zahlen12-und-zeichen/das-hier-nicht"

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 to 3

    [/autoit][autoit][/autoit][autoit]

    $Test = StringRegExp($Beispiel[$i],"\/\d{1,2}\/(.*)(?!\/)",1)

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite("Beispiel" & $i & ": " & $Test[0] & @CRLF)
    Next

    [/autoit]

    Einmal editiert, zuletzt von Tron (5. Juni 2011 um 14:23)

  • Kann mich nur an den Beispielen orientieren die du gepostet hast.
    Und da sehe ich das deine gesuchte Zeichenfolge immer in der 5. Ebene des Pfades liegt.
    Wenn das immer der Fall ist sollte folgendes klappen:

    Spoiler anzeigen
    [autoit]

    Global $Beispiel[3]

    [/autoit] [autoit][/autoit] [autoit]

    $Beispiel[0] = "http://beispiel.de/test/2011/12/diese-buchstaben-zahlen12-und-zeichen"
    $Beispiel[1] = "http://beispiel.de/test/2011/12/diese-buchstaben-zahlen12-und-zeichen/"
    $Beispiel[2] = "http://beispiel.de/test/2011/12/diese-buchstaben-zahlen12-und-zeichen/das-hier-nicht"

    [/autoit] [autoit][/autoit] [autoit]

    For $i In $Beispiel
    $a_RegExp = StringRegExp($i, "(?:/[^/]+){4}/([^/]+)", 3)
    ConsoleWrite($a_RegExp[0] & @CRLF)
    Next

    [/autoit]
  • Zunächst wäre es gut zu wissen, ob der URL-Aufbau konstant ist, da ein Muster sonst ggf. nicht immer trifft.
    Sollte es immer wie folgt Aussehen:
    http://www.Adresse.Domain/konstanterName/jahr/Monat/hier_die_wichtige_Info/abHierNixMehr
    dann könnte mein zweites Muster (oder nach kleiner Modifikation des ersten) genügen.

    [autoit]

    Global $Test
    Global $Beispiel[5]

    [/autoit][autoit][/autoit][autoit]

    $Beispiel[1] = "http://beispiel.de/test/2011/12/diese-buchstaben-zahlen12-und-zeichen"
    $Beispiel[2] = "http://beispiel.de/test/2011/12/diese-buchstaben-zahlen12-und-zeichen/"
    $Beispiel[3] = "http://beispiel.de/test/2011/12/diese-buchstaben-zahlen12-und-zeichen/das-hier-nicht"
    $Beispiel[4] = "https://testseite.de/blablabla/2012/02/diese-buchstaben-zahlen12-und-zeichen/das-hier-nicht" ; beispiel, bei dem Test1 versagt

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 to 4
    ; alternativ auch mit _StringBetween möglich, ist ja fast das selbe
    $Test1 = StringRegExp($Beispiel[$i],"http://beispiel.de/test/2011/12/([^/]+).*",1)
    ;kryptischere Variante
    $Test2 = StringRegExp($Beispiel[$i],"https?://[^/]+/[^/]*/\d{4}/\d{2}/([^/]+).*",1)
    If IsArray($Test1) Then
    ConsoleWrite(@CRLF & "Test1 :: Beispiel" & $i & ": " & $Test1[0] & @CRLF)
    EndIf
    If IsArray($Test2) Then
    ConsoleWrite(@CRLF & "Test2 :: Beispiel" & $i & ": " & $Test2[0] & @CRLF)
    EndIf
    Next

    [/autoit]


    Edit: Zu langsam und zusätzlich noch eine unschönere Lösung :whistling:

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Dankeschön für die super Hilfe.
    Mit dem "([^/]+)" am Ende funktionierts super :)