Hallo Raketenwilli,
erste naive Lösung, die auf die Array-Konvertierung verzichtet und mb_-Funktionen nutzt:
function rolfb_trim( $string, $toTrim ) {
if (!is_string($string)) return false;
if (!is_string($toTrim) || $toTrim == '') return $string;
$len = mb_strlen($string);
for ($start = 0;
$start < $len && mb_strpos($toTrim, mb_substr($string, $start, 1), 0) !== false;
$start++);
for ($end = $len - 1;
$end > $start && mb_strpos($toTrim, mb_substr($string, $end, 1), 0) !== false;
$end--);
return mb_substr($string, $start, $end-$start+1);
}
Die ist auf meinem PC ca 15% schneller. Lasse ich den input-String auf ein "x" enden, so dass sie keinen end-Trim machen muss, ist sie sogar doppelt so schnell. Verlängere ich den input-String mit str_repeat um 500 Zeichen (in der Mitte), wird sie (mit x am Ende) viermal so schnell. Offenbar ist mb_substr eine Schnecke.
Also habe ich deine und meine Lösung gemixt:
function rolf_trim2( $string, $toTrim ) {
if (!is_string($string)) return false;
if (!is_string($toTrim) || $toTrim == '') return $string;
$arString = mb_str_split( $string );
$len = count($arString);
for ($start = 0;
$start < $len && mb_strpos($toTrim, $arString[$start]) !== false;
$start++);
for ($end = $len-1;
$end > $start && mb_strpos($toTrim, $arString[$end]) !== false;
$end--);
return mb_substr($string, $start, $end-$start+1);
}
Diese Funktion ist konsistent doppelt so schnell wie Deine. Aber die Laufzeit schwankt immer noch proportional zur input-Länge, ich nehme an, der mb_str_split nicht ideal ist. Um das zu lösen, muss man wohl einen UTF-Char Iterator für Strings bauen. Hold my beer...
Rolf
--
sumpsi - posui - obstruxi
sumpsi - posui - obstruxi