Prüfen, ob ein String eine bestimmte Zeichenkette enthält

Relativ häufig braucht man im Programmieralltag die Überprüfung, ob sich ein bestimmter Teilstring in einem größeren String befindet. Diese Funktion kommt zum Beispiel zum Einsatz, wenn man prüfen möchte, ob ein String unzulässige Zeichen enthält (bspw ein Komma, wenn man dieses später als Mod-Rewrite-Trennzeichen für die URL-Parameter verwenden möchte).
Folgende 3 Möglichkeiten werden hinsichtlich ihrer Performance untersucht:

 $string = "Dies ist ein String, der keine große Aufgabe hat";   if($string!=str_replace("String","",$string)) echo "String ist enthalten";   if(strpos($string,"String")!==false) echo "String ist enthalten";   if(preg_match("/String/",$string)) echo "String ist enthalten";


Die erste Variante löscht erst den Teilstring „String“ aus dem Ursprungstext und vergleicht diesen dann mit dem ersetzten. Wenn die Texte nicht gleich sind, wurde etwas gelöscht und das bedeutet, dass der Teilstring im Ursprungstext enthalten war.

strpos() ermittelt die Position im Text, an der der gesuchte String das erste mal vorkommt und gibt diesen zurück. Falls die Funktion den String nicht findet, gibt sie false zurück (man könnte also auch statt !==false auf >0 prüfen).

Und die dritte im Bunde ist preg_match. Diese Funktion arbeitet mit einem regulären Ausdruck und gibt die Anzahl der Übereinstimmungen zurück. Da sie aber nach der ersten gefundenen Übereinstimmung abbricht, gibt es nur die Rückgabewerte 0 (keine Übereinstimmung) und 1 (Übereinstimmung gefunden).

Auswertung:

Datei Gesamtlaufzeit durchschnittliche Laufzeit pro Durchlauf Verhältnis zur schnellsten Variante
result_find_strpos.php 27.890104 s 2.789 ms 100 %
result_find_ str_replace.php 40.107672 s 4.011 ms 143 % (+43 %)
result_find_ preg_match.php 42.801546 s 4.280 ms 153 % (+53 %)

strpos ist eindeutig die schnellste Lösung, um zu prüfen, ob ein String in einem größeren String enthalten ist. preg_match ist zwar schnell, jedoch muss die Regex-Engine genutzt werden, die für solch einfache Aktionen zu mächtig und ungeeignet ist. Die Ersetzungsvariante ist recht umständlich und anschließend muss noch der Stringvergleich durchgeführt werden – das ist nicht sehr flott.

Merke: Zum Feststellen, ob sich eine Zeichenkette in einem Text befindet, sollte strpos genutzt werden!!!


Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0