Prüfen, ob ein String mit einem anderen String beginnt/endet (Thema: PHP Beispiele)

Vorstellung von Funktionen, die ermitteln, ob ein String mit einer bestimmten Zeichenkette anfängt oder aufhört.

1. Einleitung


PHP stellt keine vorgefertigten Funktionen zur Verfügung, um zu prüfen, ob ein String mit einem bestimmten anderen String anfängt oder endet. Nichtsdestotrotz kann man sich allerdings recht leicht eigene Funktionen schreiben. Dabei kann man auf strlen($str) und substr($str, $start, $length) zurückgreifen. Erstere Funktion gibt die Zeichenlänge des Strings $str zurück, letztere extrahiert aus dem String $str die Zeichenkette, welche bei Stelle $start beginnt und $length Zeichen enthält.

2. Prüfen, ob ein String mit einem bestimmten String beginnt


Es wird eine Funktion startsWith($check, $startStr) implementiert, welche prüft, ob $check mit $startStr beginnt.
Die Funktion gibt false zurück, falls $check oder $startStr kein String sind, oder falls $check nicht mit $startStr beginnt.
Zur Prüfung wird der Teilbereich von $check extrahiert, der beim ersten Zeichen beginnt und beim letzten von $startStr aufhört (letztes ist hier auf die Zeichenlänge von $startStr bezogen). Anschließend wird geprüft, ob $startStr und der extrahierte Teilbereich identisch sind.

PHP-Code
<?php
	function startsWith($check, $startStr) {
		if (!is_string($check) || !is_string($startStr) || strlen($check)<strlen($startStr)) {
			return false;
		}

		return (substr($check, 0, strlen($startStr)) === $startStr);
	}

	var_dump(startsWith('Hochhaus', 'Hoch')); // ergibt: bool true
	var_dump(startsWith('Hochhaus', 'Niedrig')); // ergibt: bool false
	var_dump(startsWith('Hochhaus', 'Hochhaus')); // ergibt: bool true
	var_dump(startsWith('Hoch', 'Hochhaus')); // ergibt: bool false
?>
Ausgabe
bool(true)
bool(false)
bool(true)
bool(false)

3. Prüfen, ob ein String mit einem bestimmten String endet


Die Implementierung von endsWith($check, $endStr) erfolgt analog zu startsWith($check, $startStr). Beim Extrahieren wird diesmal mit dem letzten Zeichen von $check begonnen. Es werden x Zeichen extrahiert, wobei x der Zeichenlänge von $endStr entspricht.

PHP-Code
<?php
	// Pruefen, ob ein String $check mit einer anderen Zeichenkette $endStr aufhoert.
	function endsWith($check, $endStr) {
		if (!is_string($check) || !is_string($endStr) || strlen($check)<strlen($endStr)) {
			return false;
		}

		return (substr($check, strlen($check)-strlen($endStr), strlen($endStr)) === $endStr);
	}

	var_dump(endsWith('Hochhaus', 'haus')); // ergibt: bool true
	var_dump(endsWith('Hochhaus', 'huette')); // ergibt: bool false
	var_dump(endsWith('Hochhaus', 'Hochhaus')); // ergibt: bool true
	var_dump(endsWith('Hochhaus', 'Super-Hochhaus')); // ergibt: bool false
?>
Ausgabe
bool(true)
bool(false)
bool(true)
bool(false)

4. Prüfung bei UTF-8


Ist der untersuchte String oder der auf den geprüft werden soll ($startStr/$endStr) in UTF-8 kodiert, empfiehlt es sich, die auf UTF-8 ausgelegten Multibyte-Funktionen zu verwenden (mb_*). Nachfolgend werden die auf UTF-8 ausgelegten Funktionen gezeigt und mit den „normalen” Versionen verglichen. (Ein konkretes Szenario in dem die Ergebnisse der verschiedenen Versionen voneinander abweichen konnte ich nicht finden. Möglicherweise ist die Funktionalität daher identisch, unabhängig davon, ob UTF-8 verwendet wird oder nicht (vermutlich prüfen die nicht-UTF-8-Versionen letztlich nur, ob die ersten/letzten x Bytes den gewünschten Bytes entsprechen). Mit den mb-Funktionen sollte man aber dennoch auf sicheren Seite sein.)

PHP-Code
<?php
	mb_internal_encoding('UTF-8');

	// --- Normale Funktionen, nicht für UTF-8 geeignet (werden für die Beispiele zum Vergleichen benötigt) ---
	function startsWith($check, $startStr) {
		if (!is_string($check) || !is_string($startStr) || strlen($check)<strlen($startStr)) {
			return false;
		}

		return (substr($check, 0, strlen($startStr)) === $startStr);
	}
	
	function endsWith($check, $endStr) {
		if (!is_string($check) || !is_string($endStr) || strlen($check)<strlen($endStr)) {
			return false;
		}

		return (substr($check, strlen($check)-strlen($endStr), strlen($endStr)) === $endStr);
	}
	
	// --- Funktionen, die auf UTF-8 ausgelegt sind ---
	function mb_startsWith($check, $startStr) {
		if (!is_string($check) || !is_string($startStr) || mb_strlen($check)<mb_strlen($startStr)) {
			return false;
		}

		return (mb_substr($check, 0, mb_strlen($startStr)) === $startStr);
	}

	function mb_endsWith($check, $endStr) {
		if (!is_string($check) || !is_string($endStr) || mb_strlen($check)<mb_strlen($endStr)) {
			return false;
		}

		return (mb_substr($check, mb_strlen($check)-mb_strlen($endStr), mb_strlen($endStr)) === $endStr);
	}

	// startsWith prüfen
	echo("startsWith / mb_startsWith\n");
	var_dump(startsWith('abc', 'a'));
	var_dump(mb_startsWith('abc', 'a'));
	var_dump(startsWith('αbc', 'α'));
	var_dump(mb_startsWith('αbc', 'α'));
	var_dump(startsWith('aβc', 'a'));
	var_dump(mb_startsWith('aβc', 'a'));
	var_dump(startsWith('ᴟm', 'ᴟ'));
	var_dump(mb_startsWith('ᴟm', 'ᴟ'));
	var_dump(startsWith('ᴟm', 'm'));
	var_dump(mb_startsWith('ᴟm', 'm'));

	// endsWith prüfen
	echo("\n endsWith / mb_endsWith\n");
	var_dump(endsWith('abc', 'c'));
	var_dump(mb_endsWith('abc', 'c'));
	var_dump(endsWith('αbc', 'c'));
	var_dump(mb_endsWith('αbc', 'c'));
	var_dump(endsWith('aβc', 'c'));
	var_dump(mb_endsWith('aβc', 'c'));
	var_dump(endsWith('abγ', 'γ'));
	var_dump(mb_endsWith('abγ', 'γ'));
	var_dump(endsWith('ᴟm', 'ᴟ'));
	var_dump(mb_endsWith('ᴟm', 'ᴟ'));
	var_dump(endsWith('ᴟm', 'm'));
	var_dump(mb_endsWith('ᴟm', 'm'));
?>
Ausgabe
startsWith / mb_startsWith
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
bool(false)

 endsWith / mb_endsWith
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
bool(false)
bool(true)
bool(true)

Kommentare (1)

Von neu nach alt
Genau so macht man Computern sinnlos arbeit. strpos === 0 tuts genau so.
Bachsau (Gast) #