1. Allgemeines zu strpos()
strpos($haystack, $needle) wird verwendet, um einen String in einem anderen String zu finden.
$haystack ist der String, der analysiert werden soll.
Nach $needle wiederum wird gesucht.
$needle darf auch nur ein einzelnes Zeichen enthalten.
Falls strpos den gesuchten String findet, wird die Position des ersten Zeichens des Strings in $haystack zurückgegeben.
Die Zählung beginnt bei 0.
Beginnt $haystack also mit $needle, gibt strpos 0 zurück.
strpos gibt (bool)false zurück, falls $needle nicht gefunden wird.
PHP-Code
<?php $needle = 'a'; // danach soll gesucht werden $haystack = 'abc'; // darin soll gesucht werden var_dump(strpos($haystack, $needle)); // ergibt: "(int) 0" // wird ein Eintrag nicht gefunden, gibt strpos false (boolean) zurueck (ab PHP5) $needle = 'a'; $haystack = 'xyz'; var_dump(strpos($haystack, $needle)); // ergibt: "(bool) false" // Es kann auch nach Strings mit mehreren Zeichen gesucht werden $needle = 'Himmel'; $haystack = 'Der Himmel ist blau.'; var_dump(strpos($haystack, $needle)); // erzeugt: 4 ?>
Ausgabe
int(0) bool(false) int(4)
2. Wieso === und nicht == verwendet werden sollte
Es ist zu beachten, dass in PHP der Vergleich (0 == false) true ergibt.
Es sollte daher „===” (oder „!==”) verwendet werden, andernfalls werden Strings Probleme machen, die mit $needle beginnen.
PHP-Code
<?php $rechte = 'read, write, delete'; $pos = strpos($rechte, 'read'); // Falsch if ($pos==false) { echo('Sie haben nicht die notwendigen Rechte, um dies Aktion auszuführen!'."\n"); } else { echo('Sie haben die notwendigen Rechte.'."\n"); } // Richtig if ($pos===false) { echo('Sie haben nicht die notwendigen Rechte, um dies Aktion auszuführen!'."\n"); } else { echo('Sie haben die notwendigen Rechte.'."\n"); } // Mit !== // hier beispielhaft ohne eine Ausgabe wenn die Rechte nicht vorliegen if ($pos!==false) { echo('Sie haben die notwendigen Rechte.'."\n"); } ?>
Ausgabe
Sie haben nicht die notwendigen Rechte, um dies Aktion auszuführen! Sie haben die notwendigen Rechte. Sie haben die notwendigen Rechte.
3. mb_strpos() bei UTF-8
Sofern $needle oder $haystack Zeichen enthalten kann, die in UTF-8 kodiert sind, muss mb_strpos($haystack, $needle, 0, $encoding) verwendet werden. Andernfalls können fehlerhafte Werte ermittelt werden.
PHP-Code
<?php // OK $needle = 'α'; $haystack = 'Der erste Buchstabe des griechischen Alphabets lautet α.'; var_dump(strpos($haystack, $needle)); var_dump(mb_strpos($haystack, $needle, 0, 'UTF-8')); // fehlerhaft $needle = 'Ṉ'; $haystack = 'a b Ṅ c d Ṉ e f g'; var_dump(strpos($haystack, $needle)); var_dump(mb_strpos($haystack, $needle, 0, 'UTF-8')); // OK $needle = 'N'; $haystack = 'a b Ṅ c d Ṉ e f g'; var_dump(strpos($haystack, $needle)); var_dump(mb_strpos($haystack, $needle, 0, 'UTF-8')); // fehlerhaft $needle = 'N'; $haystack = 'a b Ṅ c d N e f g'; var_dump(strpos($haystack, $needle)); var_dump(mb_strpos($haystack, $needle, 0, 'UTF-8')); // OK $needle = 'm'; $haystack = 'ᴟᴟᴟ'; var_dump(strpos($haystack, $needle)); var_dump(mb_strpos($haystack, $needle, 0, 'UTF-8')); ?>
Ausgabe
int(54) int(54) int(12) int(10) bool(false) bool(false) int(12) int(10) bool(false) bool(false)
4. Performance von mb_strpos() im Vergleich zu strpos()
Optional kann mb_strpos() auch verwendet werden, wenn der zu suchende String nicht in UTF-8 kodiert ist.
Die Performance von mb_strpos() ist allerdings etwas schlechter als die von strpos().
PHP-Code
<?php // mb_internal_encoding('UTF-8') setzt den von mb_strpos() standardmäßig zu verwendenden auf UTF-8. // Das ist performanter als ihn jedes Mal neu an mb_strpos() zu übergeben. mb_internal_encoding('UTF-8'); $needle = 'x'; $haystack = 'abcdefghijklmnopqrstuvwxyz0123456789'; $start = microtime(true); for ($x=0; $x<1000000; $x++) { strpos($haystack, $needle); } $end = microtime(true); $startMb = microtime(true); for ($x=0; $x<1000000; $x++) { mb_strpos($haystack, $needle); } $endMb = microtime(true); $time = number_format(($end - $start), 4); $timeMb = number_format(($endMb - $startMb), 4); echo('strpos(): ' . $time . 's'."\n"); echo('mb_strpos(): ' . $timeMb . 's'); ?>
Ausgabe
strpos(): 0.3384s mb_strpos(): 0.6989s
Kommentare (5)
Von neu nach altWir bitten um ihr Verständnis.