Einen einzelnen Buchstaben aus einem String entfernen (Thema: PHP Beispiele)

Welche verschiedenen Methoden in PHP existieren, um ein einzelnes Zeichen aus einem String zu entfernen

1. Einleitung

In diesem Artikel werden verschiedene Wege dargestellt, wie aus einem bestehenden String ein einzelnes Zeichen (anhand seiner Position im String) entfernt werden kann. Prinzipiell lassen sich auf dieses Problem alle möglichen Wege anwenden, die auch zum Entfernen mehrerer Zeichen (mit Start- und Endposition) verwendet werden. Darüber hinaus stehen in diesem Fall aber weitere Verfahren zur Verfügung. Im einzelnen werden folgende vorgestellt bzw. getestet:

  • Zugriff auf das Zeichen per Array-Schreibweise. (Dieses Verfahren wurde nur getestet und liefert nicht die gewünschten Ergebnisse, ist daher also in diesem Fall unbrauchbar.)
  • Umwandlung des Strings in ein echtes Array und entfernen des Schlüssels mit Position des Zeichens.
  • Anwendung von mb_substr(). (Empfohlene Methode.)
  • Anwendung von substr_replace().
  • Durchlaufen des Strings mittels for-Schleife.
  • Durchlaufen des Strings mittels while-Schleife.
  • Durchlaufen des Strings mittels foreach-Schleife.
  • Durchlaufen des Strings mittels array_walk().
  • Durchlaufen des Strings mittels array_map().

Das empfohlene Verfahren ist mb_substr(). Die anderen zeichnen sich vor allem durch schlechte Performance und/oder unübersichtlichen Code aus.

2. Per Zugriff auf String über Array-Schreibweise

Um ein einzelnes Zeichen aus einem String $str auszulesen, kann in PHP die Array-Schreibweise verwendet werden. So gibt etwa $str[0] einen String zurück, welcher das erste Zeichen von $str enthält. Nun ist man geneigt, dieses Verfahren auch zum Schreiben anzuwenden. Wie das nachfolgende Beispiel zeigt, funktioniert dies, wenn man einzelne Zeichen nur überschreiben will:

PHP-Code
<?php
	$str = 'Beispieltext';
	$str[3] = 'X';
	var_dump($str);
?>

HTML-Code: Ausgabe
string(12) "BeiXpieltext"


Das Löschen von Zeichen ist allerdings nicht möglich, denn das einfache Ersetzen dieser durch NULL reicht nicht aus. Versucht man dies doch, wird das Zeichen an der angegebenen Position nur durch ein Sonderzeichen ersetzt, welches vom Browser zwar in der Regel nicht dargestellt wird, im Quelltext (und damit auch im String) aber dennoch vorhanden ist.

PHP-Code
<?php
	$str = 'Beispieltext';
	$str[3] = null;
	var_dump($str);
?>

HTML-Code: Ausgabe
string(12) "Bei�pieltext"


Dabei spielt es keine Rolle, ob die neue Schreibweise für den Zugriff auf Strings ($str[x]) oder die alte ($str{x}) verwendet wird. Das Ergebnis bleibt das selbe:

PHP-Code
<?php
	$str = 'Beispieltext';
	$str{3} = null;
	var_dump($str);
?>

HTML-Code: Ausgabe
string(12) "Bei�pieltext"


Testweise wird nun unset() auf das dritte Zeichen angewendet, doch dies löscht nicht die entsprechende Position im String, sondern erzeugt stattdessen einen Fatal Error:

fatal error

PHP-Code
<?php
	$str = 'Beispieltext';
	unset($str[3]);
	var_dump($str);
?>

HTML-Code: Ausgabe
<br />
<b>Fatal error</b>:  Cannot unset string offsets in <b>...\test.php</b> on line <b>3</b><br />


Verwendet man stattdessen die Formulierung „$str[x] = (unset)$str[x];”, entsteht kein Fatal Error. Dafür erhält man aber wieder das selbe Ergebnis wie bei „$str[x] = null;”. (Das ist auch zu erwarten, da (unset)$x nichts anderes als NULL ist.)

PHP-Code
<?php
	$str = 'Beispieltext';
	$str[3] = (unset)$str[3];
	var_dump($str);
?>

HTML-Code: Ausgabe
string(12) "Bei�pieltext"


Ebenfalls keine Abhilfe schafft die Zuweisung eines leeren Strings, das Ergebnis ist wieder identisch:

PHP-Code
<?php
	$str = 'Beispieltext';
	$str[3] = '';
	var_dump($str);
?>

HTML-Code: Ausgabe
string(12) "Bei�pieltext"


Da das Zeichen in den vorherigen Beispielen immer durch ein Sonderzeichen ersetzt wurde, mag man sich nun fragen, welches Zeichen dies genau ist. Wie das folgende Beispiel zeigt, handelt es sich dabei um ein Zeichen mit dem Ordinalwert 0:

PHP-Code
<?php
	$str = 'A';
	$str[0] = null;
	var_dump(ord($str[0]));
?>

HTML-Code: Ausgabe
int(0)


3. Umwandlung in ein echtes Array

Der Weg über unset(), der zuvor einen Fatal Error produziert hat, lässt sich mit einem Trick doch noch anwenden. Dazu muss der String nur gezielt in ein Array umgewandelt werden. Jedes einzelne Zeichen entspricht dann einem Element im Array (Position => Zeichen). Das lässt sich am einfachsten mit str_split() erreichen, welches genau solch ein Array erzeugt. Anschließend wird unset($str[x]) angewendet, um das Zeichen an Position x aus dem Array zu entfernen. Zum Schluss werden über implode() die einzelnen Array-Elemente wieder zu einem String „verschmolzen”. Das nachfolgende Beispiel zeigt dieses Verfahren:

PHP-Code
<?php
	$str = 'Beispieltext';
	$arr = str_split($str); // String in Array umwandeln
	unset($arr[3]); // Zeichen mit Index 3 loeschen (entspricht dem 4. Zeichen)
	$str = implode('', $arr); // Array in String umwandeln
	var_dump($str);
?>

HTML-Code: Ausgabe
string(11) "Beipieltext"


Im vorherigen Beispiel wurden noch drei Zeilen Code benötigt, um das Zeichen aus dem String zu entfernen. Das kann mit einem weiteren Trick auf einen Einzeiler reduziert werden. Statt unset() wird diesmal die Funktion array_diff_key($arr1, $arr2) verwendet, welche aus $arr1 alle Elemente entfernt, deren Schlüssel auch in $arr2 vorkommt. Es soll hier nur ein Element mit Schlüssel 3 entfernt werden, denn Ziel ist es, das Zeichen mit Index 3 im String zu löschen. Daher wird an die Funktion für $arr2 ein Array übergeben, welches einen Wert mit Schlüssel 3 enthält. Welcher Wert das genau ist, spielt keine Rolle — Hauptsache der Schlüssel ist gesetzt. Hier wird schlicht (bool)true verwendet.

PHP-Code
<?php
	$str = 'Beispieltext';
	$str = implode('', array_diff_key(str_split($str), array(3 => true)));
	var_dump($str);
?>

HTML-Code: Ausgabe
string(11) "Beipieltext"


4. mb_substr()

Vermutlich die am häufigsten verwendete Methode zum Löschen von Zeichen ist mb_substr($str, $start, $length). Die Methode löscht nicht direkt Zeichen, sondern extrahiert nur einen Teilabschnitt aus dem ursprünglichen String. Daher muss sie zwei Mal angewandet werden: Ein mal, um alles vor dem Zeichen zu extrahieren und ein mal, um alles danach auszuschneiden.

PHP-Code
<?php
	$str = 'Beispieltext';
	$str = mb_substr($str, 0, 3) . mb_substr($str, 4);
	var_dump($str);
?>

HTML-Code: Ausgabe
string(11) "Beipieltext"


Diese Methode ist empfehlenswert, da sie performant ist, praktisch identisch auch auf mehr als ein Zeichen angewendet werden kann und Unicode-kompatibel ist (Sonderzeichen gehen also nicht unbeabsichtigt kaputt). Zudem ist der Code kompakt und lesbar.

5. substr_replace()

Ein weiterer Weg ist die Verwendung von substr_replace($str, $replaceWith, $start, $length). Diese ersetzt in $str alles ab Zeichen $start (beginnend bei 0) bis $start+$length (nicht einschließlich des letzten Zeichens) mit dem String $replaceWith. Übergibt man einen leeren String, dann wird der Abschnitt von $start bis $start+$length gelöscht. Rückgabe der Funktion ist ein neuer String, welcher sich aus den beschriebenen Operationen ergibt. Die Funktion ist im Gegensatz zu mb_substr() nicht Unicode-kompatibel, sollte also am besten nur auf Strings angewendet werden, welche keine Sonderzeichen enthalten.

PHP-Code
<?php
	$str = 'Beispieltext';
	$str = substr_replace($str, '', 3, 1);
	var_dump($str);
?>

HTML-Code: Ausgabe
string(11) "Beipieltext"


6. for-Schleife

Eine aufwändige Methode ist es, den String mit einer for-Schleife zu durchlaufen und dabei einen neuen String zu generieren, dem man — Zeichen für Zeichen — seinen neuen Inhalt zuweist. Um ein bestimmtes Zeichen zu löschen muss dann nur in jedem Durchlauf geprüft werden, ob dieser Index derzeit aktiv ist, um in diesem Fall das Zeichen zu überspringen.

PHP-Code
<?php
	$str = 'Beispieltext';
	$out = '';
	for ($x=0, $len=mb_strlen($str); $x<$len; ++$x) {
		if ($x !== 3) {
			$out .= mb_substr($str, $x, 1);
		}
	}
	var_dump($out);
?>

HTML-Code: Ausgabe
string(11) "Beipieltext"


7. while-Schleife

Die while-Schleife funktioniert hier nach dem selben Prinzip wie die for-Schleife: Der String wird durchlaufen, währenddessen wird ein neuer String gebildet und das zu löschende Zeichen wird übersprungen.

PHP-Code
<?php
	$str = 'Beispieltext';
	$out = '';

	$x = 0;
	while (isset($str[$x])) {
		if ($x!==3) {
			$out .= $str[$x];
		}
		++$x;
	}
	var_dump($out);
?>

HTML-Code: Ausgabe
string(11) "Beipieltext"


8. foreach-Schleife

Um eine foreach-Schleife zu verwenden wird der String in ein Array umgewandelt, welches den Aufbau „Position des Zeichens => Zeichen” hat. Der restliche Verlauf entspricht dem der for- und while-Schleifen: Array Element für Element durchlaufen, dabei neuen String Zeichen für Zeichen bilden und das zu löschende Zeichen überspringen.

PHP-Code
<?php
	$str = 'Beispieltext';
	$out = '';
	foreach (str_split($str) as $key=>$val) {
		if ($key!==3) {
			$out .= $val;
		}
	}
	var_dump($out);
?>

HTML-Code: Ausgabe
string(11) "Beipieltext"


9. array_walk()

Die Funktion array_walk() kann verwendet werden, um eine Callback-Funktion auf jedes Element in einem Array anzuwenden. Auf diese Weise kann ein Zeichen aus dem String entfernt werden. Zuvor muss der String mit str_split() in ein Array umgewandelt werden. Die Callback-Funktion ähnelt dem Verfahren bei Verwendung der Schleifen (for/while/foreach) und macht letztlich nichts anderes, als das Zeichen mit Index 3 im Array in einen leeren String umzuwandeln und dadurch zu entfernen. Am Ende wird das Array mit implode() wieder in einen String konvertiert.

PHP-Code
<?php
	$str = 'Beispieltext';
	$arr = str_split($str);
	array_walk($arr, function(&$val, $key) {
				$val = ($key===3 ? '' : $val);
			});
	$str = implode('', $arr);
	var_dump($str);
?>

HTML-Code: Ausgabe
string(11) "Beipieltext"


10. array_map()

Die Anwendung von array_map() verläuft fast identisch zu der von array_walk(). Einziger Unterschied ist hier, dass die Callback-Funktion nicht dem zu löschenden Wert im Array per Referenz direkt einen leeren String zuweist, sondern stattdessen diesen per „return” zurückgibt. Die Zuweisung wird dann von array_map() vorgenommen.

PHP-Code
<?php
	$str = 'Beispieltext';
	$arr = str_split($str);
	$out = array_map(function ($key, $val) {
			return ($key===3 ? '' : $val);
		}, range(0, strlen($str)), $arr);
	$str = implode('', $out);
	var_dump($str);
?>

HTML-Code: Ausgabe
string(11) "Beipieltext"


Kommentare (0)

Von neu nach alt