Raketenwilli: PHP trim() , Lösung für UTF-8 : Versuch mit Array, Wettbewerb?

Beitrag lesen

Ich habe „ideenhalber“ mal versucht, eine auf Arrays basierende Funktion zu schreiben, die mit UTF-Symbolen kann. Diese scheint zu funktionieren, mir auch ausreichend schnell zu sein - ist aber noch nicht genügend getestet.

Weshalb ich das Zeug ausdrücklich als „bad“ („schlecht“, „nicht verwenden”) markiere:

<?php

$nbsp = chr(0xC2).chr(0xA0);
$string = '🛠' . $nbsp . 'äüöödäipusö🛠' . $nbsp . 'öäü';
$toTrim = '🛠öä' . $nbsp . 'ü';

echo 'Zu durchsuchender String (HTML-kodiert:)'. PHP_EOL;
echo "\t". '"' . htmlentities( $string, ENT_HTML5 ) .'"' . PHP_EOL . PHP_EOL;

echo' Zu entfernende Zeichen: (HTML-kodiert:)' . PHP_EOL;
echo "\t". '"' . htmlentities( $toTrim, ENT_HTML5 ) .'"' . PHP_EOL . PHP_EOL;

echo 'Ergebnis: "' .  raketen_trim( $string, $toTrim ) . '"' . PHP_EOL;

$rounds = 1000000;
$start = microtime(true);
for ($i=0; $i<$rounds; $i++) {
	raketen_trim( $string, $toTrim ) . PHP_EOL;
}
echo  round( ( microtime(true) - $start) * 1000)  . ' Millisekunden für ' . $rounds . ' Runden.'  .  PHP_EOL;




function raketen_trim( $string, $toTrim ) {

	if ( '' == $string ) return '';

	if ( ! is_array( $toTrim ) ) {
		$arToTrim = mb_str_split( $toTrim );
	}
	if ( ! count($arToTrim ) ) return $string;

	$arString = mb_str_split( $string );

	$changed = true;
	while ( $changed ) {
		$changed = false;
		if (  in_array( $arString[ 0 ], $arToTrim ) ) {
			array_shift( $arString );
			if (0 == count( $arString ) ) return '';
			$changed = true;
			
		}
		if ( in_array( $arString[ sizeof($arString) -1 ], $arToTrim ) ) {
			array_pop( $arString );
			if (0 == count( $arString ) ) return '';
			$changed = true;			
		}
	}
	return implode( '', $arString );
}

Ausgaben: (Die Leerzeichen sind "geschützte Leerzeichen"):

Zu durchsuchender String (HTML-kodiert:)
	"🛠&nbsp;&auml;&uuml;&ouml;&ouml;d&auml;ipus&ouml;🛠&nbsp;&ouml;&auml;&uuml;"

 Zu entfernende Zeichen: (HTML-kodiert:)
	"🛠&ouml;&auml;&nbsp;&uuml;"

Ergebnis: "däipus"
10226 Millisekunden für 1000000 Runden.

Wettbewerb(e):

  1. Fehler finden
  2. eine schnellere (und funktionierende) Funktion schreiben