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:)
"🛠 äüöödäipusö🛠 öäü"
Zu entfernende Zeichen: (HTML-kodiert:)
"🛠öä ü"
Ergebnis: "däipus"
10226 Millisekunden für 1000000 Runden.
Wettbewerb(e):
- Fehler finden
- eine schnellere (und funktionierende) Funktion schreiben