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!!!