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

Kommentare (5)

Von neu nach alt
1234567
ArnoNuehm (Gast) #
123456
ArnoNuehm (Gast) #
12345
ArnoNuehm (Gast) #
1234
ArnoNuehm (Gast) #
123
ArnoNuehm (Gast) #