Einen String umdrehen (Thema: PHP Beispiele)

Mögliche Wege, um die Reihenfolge der Buchstaben/Zeichen in einem String umzukehren

1. String mit strrev() umdrehen


Zum Umdrehen eines Strings ist in PHP die Funktion strrev($string) vorgesehen.
An diese wird einfach ein String übergeben, welcher umgedreht zurückgegeben wird:
PHP-Code
<?php
	$str = 'abcdefg';
	var_dump(strrev($str));

	// Funktioniert natürlich auch mit Zahlen
	$str = '123456';
	var_dump(strrev($str));
?>
Ausgabe
string(7) "gfedcba"
string(6) "654321"


2. In UTF-8 kodierte Strings umdrehen


strrev() kann fehlerhafte Ausgaben erzeugen, wenn für den String UTF-8 als Zeichensatz verwendet wird (statt zum Beispiel ISO-8859-1 oder ASCII).
Folgende Funktion behebt dieses Problem.

PHP-Code
<?php
	mb_internal_encoding('UTF-8');
	
	function mb_strrev($str) {
		$r = '';
		// String wird rückwärts durchlaufen und parallel ein neuer String gebildet
		for ($x=mb_strlen($str); $x>0; $x--) {
			$r .= mb_substr($str, $x-1, 1);
		}
		return $r;
	}
	
	$str = 'abc';
	var_dump(strrev($str));
	var_dump(mb_strrev($str));

	$str = 'αβγ';
	var_dump(strrev($str));
	var_dump(mb_strrev($str));
?>
Ausgabe
string(3) "cba"
string(3) "cba"
string(6) "�βα�"
string(6) "γβα"

3. String umdrehen, aber Reihenfolge von Zahlen beibehalten


Die nachfolgende Funktion dreht einen String um, belässt die Zahlen in diesem aber in der ursprünglichen Reihenfolge.
Das schließt Zahlen in Formelschreibweise oder Rechnungen (zum Beispiel 1500+30/2) mit ein.
Auch Zahlen mit Kommata und Punkten (z.B. 1.000.000 oder 50,3) bleiben unberührt.
Einige Einschränkungen der Funktion:
  • Buchstaben in Formeln werden nicht als zur Formel/Rechnung gehörend beachtet (etwa x und y).
  • Ob eine Formel/Rechnung korrekt ist wird nicht beachtet (5+++++4 wird z.B. ebenfalls nicht umgedreht).
  • Auch einzelne mathematische Zeichen außerhalb von Formeln/Rechnungen werden nicht umgedreht (z.B. wird in *.exe nicht das *. umgedreht).
  • Folgt eine Formel/Rechnung direkt auf einen Punkt am Satzende, dann wird der Punkt ebenfalls nicht umgedreht.

PHP-Code
<?php
	mb_internal_encoding('UTF-8');
	
	function mb_strrev_keep_numbers($str) {
		$r = '';
		$buffer = '';
		$mathChars = array('.', ',', '+', '-', '/', '*', '%', '=', '^', '(', ')');
		for ($x=mb_strlen($str); $x>0; $x--) {
			$c = mb_substr($str, $x-1, 1);
			if (is_numeric($c) || in_array($c, $mathChars)) {
				$buffer = $c . $buffer;
			} else {
				$r .= $buffer . $c;
				$buffer = '';
			}
		}
		return $buffer.$r;
	}
	
	$str = 'abcdefg';
	var_dump(mb_strrev_keep_numbers($str));
	$str = 'Es wurden ca. 540 Lines of Code geschrieben.';
	var_dump(mb_strrev_keep_numbers($str));
	$str = 'Die Lösung lässt sich anhand von 800/(50*3) bestimmen.';
	var_dump(mb_strrev_keep_numbers($str));
	$str = 'abcdef 1000+200,4';
	var_dump(mb_strrev_keep_numbers($str));
?>
Ausgabe
string(7) "gfedcba"
string(44) ".nebeirhcseg edoC fo seniL 540 .ac nedruw sE"
string(54) ".nemmitseb 800/(50*3) nov dnahna hcis tässl gösunL eiD"
string(17) "1000+200,4 fedcba"

4. String umdrehen, aber kodierte HTML-Entities beibehalten


Die nachfolgende (mit UTF-8 einsetzbare) Funktion dreht den übergebenen String um, behält aber alle HTML-Entities bei.
HTML-Entities sind Codierungen spezieller Sonderzeichen.
Sie beginnen mit einem „&” und enden auf einem Semikolon.
Zwischen dem „&” und dem „;” kann entweder eine normale Zeichenkette als Name stehen (z.B. „lt” oder „alpha”) oder eine Zahl mit vorangestellten Doppelkreuz (z.B. „#8800”).

PHP-Code
<?php
	mb_internal_encoding('UTF-8');
	
	function mb_strrev_entities($str) {
		$r = '';
		$buffer = '';
		for ($x=mb_strlen($str); $x>0; $x--) {
			$c = mb_substr($str, $x-1, 1);
			// Sobald ein Semikolon gefunden wird, wird nach &xyz; oder &#1345; (oder Vergleichbarem) gesucht
			if ($c === ';') {
				// Die Schleife läuft maximal 10 Zeichen bis zum nächsten & vor.
				for ($y=$x; $y>0 && $x-$y<10; $y--) {
					$c2 = mb_substr($str, $y-1, 1);
					$buffer =  $c2 . $buffer;
					if ($c2==='&') {
						break;
					}
				}
				
				// Prüfen, ob Puffer einem Entity entspricht (Beispiele: &#8800;, &there4;, &le;, &OElig;)
				if (preg_match('/^\&#?[0-9a-zA-Z]+;$/u', $buffer)) {
					$r = $r . $buffer;
					// $x muss geändert werden, um Entity in der normalen Schleife zu überspringen
					$x = $x - (mb_strlen($buffer)-1); //-1 da $x bereits auf Semikolon zeigt
					$buffer = '';
				} else {
					// Puffer entspricht nicht Entity, Schleife fährt normal ab Semikolon fohrt
					$r .= $c;
				}
			} else {
				// $c entspricht nicht Semikolon, wird normal hinzugefügt
				$r .= $c;
			}
		}
		return $r;
	}
	
	// Entity in der Mitte
	$str = 'Test &thetasym; Test';
	var_dump(mb_strrev_entities($str));
	$str = 'Test &ETH; Test';
	var_dump(mb_strrev_entities($str));
	$str = 'Test &#8773; Test';
	var_dump(mb_strrev_entities($str));
	
	// Entity am Ende
	$str = 'Test Test &#8773;';
	var_dump(mb_strrev_entities($str));
	$str = 'Test Test &alpha;';
	var_dump(mb_strrev_entities($str));
	
	// Entity am Anfang
	$str = '&#8773; Test Test';
	var_dump(mb_strrev_entities($str));
	$str = '&alpha; Test';
	var_dump(mb_strrev_entities($str));
	
	// Strings, die keine wirklichen Entities sind
	$str = 'Test #8773; Test';
	var_dump(mb_strrev_entities($str));
	$str = 'Test &; Test';
	var_dump(mb_strrev_entities($str));
?>
Ausgabe
string(20) "tseT &thetasym; tseT"
string(15) "tseT &ETH; tseT"
string(17) "tseT &#8773; tseT"
string(17) "&#8773; tseT tseT"
string(17) "&alpha; tseT tseT"
string(17) "tseT tseT &#8773;"
string(12) "tseT &alpha;"
string(16) "tseT ;3778# tseT"
string(12) "tseT ;& tseT"

5. Nur Reihenfolge der Wörter umdrehen


Mit der nachfolgenden einfachen Funktion kann die Reihenfolge der Wörter in einem Satz umgekehrt werden.
Die Zeichen innerhalb der einzelnen Wörter bleiben davon aber jeweils unberührt.

PHP-Code
<?php
	function wordrev($str) {
		$words = explode(' ', $str);
		return implode(' ', array_reverse($words));
	}
	
	// Standard-Beispielsatz
	$str = 'Das ist ein einfacher Beispielsatz.';
	var_dump(wordrev($str));
	
	// Beispielsatz mit nur einem Wort
	$str = 'Test';
	var_dump(wordrev($str));
	
	// Leerer Beispielsatz
	$str = '';
	var_dump(wordrev($str));
	
	// Beispielsatz mit doppeltem Leerzeichen
	$str = 'Test1  Test2';
	var_dump(wordrev($str));
?>
Ausgabe
string(35) "Beispielsatz. einfacher ein ist Das"
string(4) "Test"
string(0) ""
string(12) "Test2  Test1"

Kommentare (0)

Von neu nach alt