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

Beitrag lesen

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