dedlfix: string vergleichen in php

Beitrag lesen

Tach!

Es soll … "beinhaltet einen String, der mit VRVR anfängt" geprüft werden

Was denn nun: „beïnhaltet VRVR“ oder „fängt mit VRVR an“?

Oder beides, wenn es ungenau ausgedrückt war, und stattdessen gemeint ist: "beinhaltet ein Wort an beliebiger Position, das mit VRVR anfängt". Dieser Fall wird dann wohl einen Regex erfordern, damit man Wortgrenzen erkennen kann.

Ich gehe aber davon aus, dass aus technischer Sicht gemeint war: der Aufruf der Funktion get_post_meta() soll einen String liefern/zurückgeben, der mit VRVR anfängt. Oder aus Anwendersicht: die Eingabe soll mit VRVR anfangen.

Wie auch immer: mb_strpos() (für Strings) bzw. strpos() für was auch immer.

Die Antwort ist sehr knapp, denn sie berücksichtigt so einiges nicht.

Man kann mit der Multibyte-Funktion mb_strpos() arbeiten. Diese Multibyte-Funktionen können im Allgemeinen nur dann richtig arbeiten, wenn die Kodierung bekannt ist und entweder als optionaler Parameter angegeben wird, oder wenn sie generell mit mb_internal_encoding() gesetzt worden ist. In einem System, das man nicht kennt, sollte man aber lieber nicht die generelle Kodierungsbehandlung umstellen, damit der Rest des Programms nicht beeinflusst wird.

In diesem Fall ist es aber nicht notwendig die mb-Variante zu verwenden. Gefragt ist keine genaue Position, die bei Multibyte-Strings je nach Kodierung an unterschiedlichen Bytepositionen sein könnte, sondern lediglich, ob der Anfang auf bestimmte Weise beginnt, und das ist immer die Position 0. Es kommt lediglich darauf an, dass die Kodierung der Eingabe mit der Kodierung der Code-Datei übereinstimmt. Und gehen wir mal davon aus, dass lediglich ISO-8859-1 (oder 15) oder UTF-8 Verwendung finden, dann muss die Kodierung nur dann übereinstimmen, wenn Nicht-ASCII-Zeichen im gesuchten Teilstring vorkommen. Ein a beispielsweise ist in ISO-8859-1 gleich kodiert wie eins in UTF-8. Ein ä wäre das nicht, und der Vergleich wird fehlschlagen. Ansonsten ist es für den vorliegenden Fall kein Problem, die Kodierung unbeachtet zu lassen. Das ist zwar ein wenig schlampig, jedoch ändert sich das Ergebnis dadurch nicht.

Apropos Ergebnis, hier muss man in jedem Fall (mb_strpos oder strpos) darauf achten, dass die Positionsangabe 0 mit dem false für "gar nicht enthalten" verwechselt werden kann, wenn man einen einfachen Vergleich mit == oder != verwendet. Hier muss typsicher mit === oder !== vergleichen werden. Die Beispiele #1 und #2 im PHP-Handbuch zeigen die Anwendung von strpos() sogar fast passend für den vorliegenden Fall, die Prüfung müsste statt false nur auf 0 erfolgen.

dedlfix.