kostenloser Webspace werbefrei: lima-city


Reguläre Ausdrücke (preg_match)

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    c*****s

    Hallo,

    die Regulären Ausdrücke, die diese Funktion verwendet, sind teilweise anders als ich sie kenne bzw. halten sich nicht an den Standard. Weiß jemand wo sie dokumentiert sind? Vielen Dank!
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. calexus schrieb: Hallo,
    die Regulären Ausdrücke, die diese Funktion verwendet, ...


    Hmm die Regex für preg_match sind Perl-compatible steht unter
    http://de.php.net/manual/de/function.preg-match.php
    Falls du Hilfe brauchst, einfach mal deine Regex posten und natürlich was dein erwartetes Ergebnis ist ;-)

    Grüßle

    Beitrag zuletzt geändert: 3.2.2009 19:52:57 von scout
  4. Die regulären Ausrücke in PHP sind manchmal wirklich ein bisschen tricky, aber wenn man sie ein paar man verwendet hat, kann man sich auch damit anfreunden. Zumal sie wirklich sehr mächtige Werkzeuge sind.
    Eine kurze Erklärung gibt es im Q-Net Tutorial, aber umfassender (und leider auch nicht ganz so leicht) erklärt ist es im PHP-Manual (besonders der Abschnitt PCRE-Suchmuster ist sehr hilfreich).
  5. Autor dieses Themas

    c*****s

    danke für eure Antworten.

    also ich bin jetzt auch nicht so der PERL-Spezialist, aber mir scheint es, als würde sich preg_match manchmal doch etwas anders verhalten.
    Der Code hier:
    $pfad = "a/b/c/d/index.html";
    preg_match("/^\/?([^\/]+\/)(\1)/",$pfad,$treffer);
    
    print_r($treffer);
    will einfach nicht funktionieren :frown:
  6. Ich vermute mal, du willst a, b, c, d und index.php einzeln haben?
    Dann würde ich preg_match_all anstatt preg_match verwenden, da das alle Vorkommen findet und nicht nur das erste.
    Dann sagst du ihm "beginne mit einem Slash am Anfang des Suchstings gefolgt von null oder einem Zeichen" -> ^\/? was a schonmal ausschließen würde, auf b aber auch nicht zutrifft, da es nicht am Anfang steht.
    Was du mit dem Teil ([^\/]+\/) willst, ist mir nicht ganz klar. Das würde übersetzt soviel bedeuten wie "beginne mit dem Zeichen Slash am Anfang der Stringkette, gefolgt von beliebig vielen Zeichen bis Slash". Macht mitten im Suchmuster so aber keinen Sinn.
    (\1) steht für eine Länge des Strings? Dann müsstest du {1} verwenden.

    Wenn du wirklich das willst, was ich oben angenommen habe, ist ein regulärer Ausdruck aber vielleicht gar nicht nötig, denn über explode('/',$pfad) solltest du das gleiche rausbekommen.

    Oder du sagst erstmal, was deine Erwartung ist, dann kann man dir vielleicht auch noch besser helfen^^
  7. calexus schrieb:
    danke für eure Antworten.

    also ich bin jetzt auch nicht so der PERL-Spezialist, aber mir scheint es, als würde sich preg_match manchmal doch etwas anders verhalten.
    Der Code hier:
    $pfad = "a/b/c/d/index.html";
    preg_match("/^\/?([^\/]+\/)(\1)/",$pfad,$treffer);
    
    print_r($treffer);
    will einfach nicht funktionieren :frown:


    Schau auch mal hier.

    Was macht das Suchmuster. Es sucht 0-1 "/" (^\/?), diese passt auf das Suchwort.
    Dann suchst du die nächsten nicht "/" gefolgt von eine "/" ([^\/]+\/) das währe in deinen Fall "a/".

    Jetzt suchst du aber etwas, was es in deinen Suchwort nich gibt. Nämlich das erste "subpatter" was in deinen Fall ja "a/" ist.

    Also müsstest du zumindest "a/a/b/c/d/index.html" benutzen damit du etwas findest.
  8. Autor dieses Themas

    c*****s

    mit dem Code will ich einfach das Stammverzeichnis herausfinden, also a/.
    \1 ist die Backreference.

    Das Ergebnis a/ sollte in $treffer[1] gespeichert werden, das Feld ist aber komplett leer.
  9. Dann ist es trotzdem einfacher den String per explode('/', $path); aufzutrennen und das erste Element sollte dann dein Stammverzeichnis sein.
  10. Autor dieses Themas

    c*****s

    tct schrieb: Dann ist es trotzdem einfacher den String per explode('/', $path); aufzutrennen und das erste Element sollte dann dein Stammverzeichnis sein.
    ok, bei dem Code hast du recht, dass es mit explode einfacher ist. Trotzdem bleibt die Frage, warum die Backreference nicht so funktioniert wie bei PERL :confused:
  11. calexus schrieb:
    tct schrieb: Dann ist es trotzdem einfacher den String per explode('/', $path); aufzutrennen und das erste Element sollte dann dein Stammverzeichnis sein.
    ok, bei dem Code hast du recht, dass es mit explode einfacher ist. Trotzdem bleibt die Frage, warum die Backreference nicht so funktioniert wie bei PERL :confused:


    Hast du meine Beitrag gelesen?

    Wozu willst du die "Backreference" benutzen?
    Und wo soll sie bei "a/b/c/d/index.html" zufinden sein?
    Wenn da keine drin ist, dann kannst du auch kleine findet!

    Benutz mal "a/a/b/c/d/index.html" dann wirst du auch was finden.
  12. Autor dieses Themas

    c*****s

    Hast du meine Beitrag gelesen?

    Wozu willst du die "Backreference" benutzen?
    Und wo soll sie bei "a/b/c/d/index.html" zufinden sein?
    Wenn da keine drin ist, dann kannst du auch kleine findet!

    Benutz mal "a/a/b/c/d/index.html" dann wirst du auch was finden.
    Ja, ich hab ihn gelesen.

    Aber unabhängig davon, die Backreference funktioniert immer noch nicht.

    Ich habe es jetzt noch mal etwas abgeändert:
    $pfad = "a/a/a/a/a/b/c/d/index.html";
    preg_match("/^\/?([^\/]+\/)(\1)*/",$pfad,$treffer);
    
    print_r($treffer);
    Der Code dient jetzt dazu, das Stammverzeichnis und alle gleichlautenden Unterverzeichnisse zu bekommen.

    Ergebnis, das ich erwarte:
    $treffer[0] = a/a/a/a/a/
    $treffer[1] = a/
    $treffer[2] = a/

    tatsächliches Ergebnis = leeres Array

    :stupid: EDIT: noch ein kleiner Fehler: wenn man " " statt ' ' benutzt muss man die Backreference schreiben als \\1 (d. h. den Backslash muss man natürlich quoten ).
    Jetzt funktioniert es endlich. Vielen Dank.

    Beitrag zuletzt geändert: 6.2.2009 0:47:33 von calexus
  13. Hmm,

    mir ist gerade eingefallen, dass es ja da auch Hilfsprogramme gibt ;-)

    http://weitz.de/regex-coach/

    Evtl. kannst ja damit bissl rumspielen und eine Lösung finden.
    Die Treffer markiert das Teil unten immer - vllt. hilfts ja.

    Grüßle
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!