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 altWir bitten um ihr Verständnis.