Im regex-pattern bitte nix finden
WauWau
- programmiertechnik
Hallo,
wieso findet
(entweder|oder|)(?:/?|/unterverzeichnis)
bei Anwendung auf
entweder
entweder/
oder
oder/
entweder/unterverzeichnis
oder/unterverzeichnis
überall das richtige, nur
/unterverzeichnis
geht nicht? Wieso funktioniert
(auswahl|andereauswahl|)
nicht? Es müsste ja eigentlicht "nix" finden.
Weiß jemand Rat? "(auswahl|andere)?" kann ich nicht verwenden, weil die Klammer umbedingt "machen" muss.
WauWau
PS: btw: Es geht um mod_rewrite.
Hallo WauWau.
geht nicht? Wieso funktioniert
(auswahl|andereauswahl|)
nicht? Es müsste ja eigentlicht "nix" finden.
Ich glaube, dass Problem liegt nicht dort sondern beim zweiten Teil.
Bei mir springt er nämlich sofort auf /? an und interressiert sich für /unterverzeichnis nicht.
Vertausche also die beiden, dann müsste es klappen.
MfG _Siro.
Hi,
(entweder|oder|)(?:/?|/unterverzeichnis)
Schon mit
(entweder|oder)?/(?:unterverzeichnis)?
probiert?
Wieso funktioniert
(auswahl|andereauswahl|)
nicht?
Ich schätze mal, daß die leere Alternative nicht so gut ist.
(auswahl|andereauswahl)?
sollte bewirken, daß auswahl, andereauswahl oder garnix gefunden wird.
Weiß jemand Rat? "(auswahl|andere)?" kann ich nicht verwenden, weil die Klammer umbedingt "machen" muss.
Dann nimm:
((?:auswahl|andere)?)
cu,
Andreas
Hallo MudGuard,
(entweder|oder|)(?:/?|/unterverzeichnis)
Schon mit
(entweder|oder)?/(?:unterverzeichnis)?
probiert?
Nein. Die Klammern müssen nämlich umbedingt "finden". Kennst du mod_rewrite? Darum geht es in diesem Fall jedenfalls. Wie bei Perl auch kommen die Backreferences auf die gefundenden Klammern mittels $x zustande. Entsprechend habe ich z.B. soetwas:
^verzeichnis(?:/?|(unterverzeichnis)(?:/?|(nocheins)(?:/?|(undnocheins))))$
und das wird dann an
"bla.cgi?verz1=$1&verz2=$2&verz3=$3
ersetzt. (Selbstverständlich sieht der Pattern dann etwas komplizierter aus, soetwas wie da oben hätte recht wenig sinn ;) Würde ich hierbei anstatt des Patterns oben
^verzeichnis(/unterverzeichnis(/nocheins(/undundnocheins)?)?)?$
oder sowas schreiben, würde es nicht mehr funktionieren. Denn z.B. würden die existierenden "Rückreferenzen" sich "verschieben". Verstehst du, was ich meine? (Verzeihe mir, ich bin gerade nicht in der Lage, es besser auszudrücken 8[)
Wieso funktioniert
(auswahl|andereauswahl|)
nicht?
Ich schätze mal, daß die leere Alternative nicht so gut ist.
Ja, davon gehe ich auch aus. Aber z.B. bei den PHP-Regulären Expressions (Perl Compatible & POSIX erweitert) sowie bei ganz einfachen Perl-Regular-Expressions funktioniert sowas wunderbar.
(auswahl|andereauswahl)?
sollte bewirken, daß auswahl, andereauswahl oder garnix gefunden wird.
Das ist ja wunderbar, aber nehmen wir mal folgendes Beispiel:
^(a|b)?(?:/?|/c)$
> "bla=$1&zwei=$2"
Beim Testen mit der Eingabe "a/c" würde hierbei "bla=a&zwei=c" herauskommen. Bei der Eingabe von "/c" jedoch "bla=c&zwei=". Und darf dann in diesem fall nicht funktionieren, wenn das nämlich ein Querystring für ein CGI-Script wäre. Sofern ich das Script dann nicht das ganze versuchen lassen will, dynamisch zu erkennen, dann würde das ein ziemliches Schuselzeugs werden. Somit muss $1 _umbedingt_ "treffen", also gesetzt sein (wenn auch als ""), damit dann sowas wie
"cgi.pl?typ=$1&year=$2&month=$3&day=$4"
nicht zu "cgi.pl?typ=2004&year=may&month=03&day=" wird.
Dann nimm:
((?:auswahl|andere)?)
Tja, genau daran habe ich etwa 4 Minuten nach meinem posting auch gedacht. Seltsamerweise funktioniert es nicht! Es ist mir ein Rätsel, warum nicht. Ich werde es nochmal ausprobieren.
WauWau
Hallo siro, hallo MudGuard,
mein vorheriges Problem auf die Praxis bezogen war folgendes (mod_rewrite):
<Directory "...">
RewriteEngine On
RewriteBase /news
RewriteRule ^(blog|news|)(?:/?|/(\d{4})(?:/?|/(\d{1,2}|[^/]{3,10})(?:/?|/[^\d]*(\d+)[^\d/]*(?:/?|/(.*)))))$ "view.php?view=$1&year=$2&month=$3&news=$4&subquery=$5"
</Directory>
Das hat nunmal nicht funktioniert. Abgeändert habe ich es nun nach
<Directory "...">
RewriteEngine On
RewriteBase /news
RewriteRule ^((?:blog|news)?)/?(?:(\d{4})(?:/?|/(\d{1,2}|[^/]{3,10})(?:/?|/[^\d]*(\d+)[^\d/]*(?:/?|/(.*)))))?$ "view.php?view=$1&year=$2&month=$3&news=$4&subquery=$5"
</Directory>
Und jetzt funktioniert es wunderbar. Zum einen habe ich eben ((?:auswahl|andere)?) eingefügt, zum Anderen - etwas von siros Empfehlung modifiziert, "/?(?:......)?" anstatt "(?:/?|.....)" geschrieben. Hier würde zwar auch ein Aufruf von "/news/blog2004" z.B. zum gewünschten Ergebnis führen - aber warum sollte mich das stören? ;-)
Vielen dank,
WauWau