Position eines Strings in einem anderen String ermitteln (Thema: PHP Beispiele)

Wie mit Hilfe von strpos() und mb_strpos() ein String oder ein Zeichen in einem anderen String gesucht werden kann

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
Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen zu Cookies erhalten Sie in unserer Datenschutzerklärung. OK