PHP-Abfrage
Günter G.
- php
Hallo,
das Statement sollte prüfen, ob $query_string leer ist oder 'L' enthält.
if (preg_match('/^$/'|'/^L$/', $query_string))
{.....}
Leider bringt es einen "error".
Wenn ich nur '/^$/' angebe, kommt kein Fehler.
Was ist die Ursache?
Aloha ;)
if (preg_match('/^$/'|'/^L$/', $query_string)) {.....}
Was ist die Ursache?
Betrachte den Parameter des Funktionsaufrufs. Unabhängig vom Inhalt der Strings steht da: 'irgendwas'|'irgendwas' - die Funktion preg_match erwartet aber einen String, nicht zwei mit einem Oder-Zeichen dazwischen, mal ganz davon abgesehen, dass die Pipe in PHP für den Bitweise-Oder-Operator steht, also etwas ganz anderes täte als von dir beabsichtigt.
Was du suchst ist eigentlich folgendes: Ein einzelner regulärer Ausdruck, der entweder auf einen leeren String oder auf einen String mit einem einzelnen L matcht (der also so gesehen bis auf das L auch leer ist).
Meiner Ansicht nach solltest du das damit erreichen:
if (preg_match('/^L?$/', $query_string)) {.....}
Der Fragezeichen-Operator im Regex ist der Multiplikator für "genau einmal oder keinmal", es wird also auf Leerstring (keinmal L) und auf "L" (einmal L) gematcht.
Tipp: Mir hat was reguläre Ausdrücke angeht regexr.com bereits des Öfteren weitergeholfen, gerade wenn es um kompliziertere Sachen z.B. mit mehrfacher Verschachtelung ging.
Grüße,
RIDER
Hallo Günter,
gegen Janoschs Vorschlag mit dem Fragezeichen ist fast nichts einzuwenden, ich möchte aber erstmal auf dein Missverständnis mit dem |
eingehen.
Es gibt einen PHP-Operator |
, und es gibt einen Regex-Operator |
. Beide bedeuten „oder“, aber für unterschiedliche Dinge.
Wenn du die Regex und den String schließt und dann den Operator setzt, ist es der PHP Operator. Den wolltest du aber nicht, und er ist auch nicht auf Strings anwendbar, sondern auf Zahlen. PHP versucht deshalb, aus deinen Regexen Zahlen zu machen, was nicht gelingt und bestenfalls 0 ergibt. Bitweises OR von 0 und 0 ergibt 0, und dann entsteht das nächste Problem: preg_match erwartet einen String als Eingabe. Spätestens jetzt gibt PHP auf.
Um den Regex-Operator zu bekommen, musst du in der Regex bleiben. Du könntest also '/^$|^L$/'
schreiben. Das würde funktionieren, ist aber umständlicher als Janoschs '/^L?$/'
.
Zu dem „fast nichts“: Du solltest erstmal innehalten und fragen, ob Regex das richtige Werkzeug ist. Würdest du eine Gartenbaufirma kommen lassen, um die Blumen auf deinem Balkon zu gießen? Kann man machen, es gibt vielleicht auch Balkone, wo das Sinn ergibt, aber zumeist ist es eine Kanone für einen Spatz.
Ein einfacher Stringvergleich geht auch:
if ($query_string == '' || $query_string =='L') {.....}
Beachte das ||
, das ist das logische OR, das Wahrheitswerte vergleicht und etwas anderes ist als das bitweise OR, das du mit |
bekommst.
Es ist mehr Schreibarbeit, dafür hat du die Blumen gegossen, ohne dafür eine Tagesbaustelle zu errichten 😉. Die Regex Maschine ist wirklich aufwändig.
Rolf
@@Günter G.
ob $query_string leer ist oder 'L' enthält.
Was meinst du damit? Ich hab das beim ersten Lesen anders gedeutet als @Camping_RIDER und @Rolf B. Der String "beim ersten Lesen" enthält auch ein L.
Soll der String nun ein L enthalten oder gleich "L" sein?
🖖 Live long and prosper