html_entity_decode verwandelt bekanntlicherweise Entities wie ü oder & in ihre Pendandts ü / &.
var_dump(html_entity_decode("&")); //string(1) "&"
Soviel also dazu, soweit erwartungsgemäß. Enter the weirdness:
<meta charset="utf8"> <?php var_dump(trim(html_entity_decode(" "))); //string(2) " "
Das Manual sagt dazu:
Sie wundern sich vielleicht, warum trim(html_entity_decode(‚ ‚)); den String nicht zu einem leeren Sting reduziert. Der Grund dafür ist, dass ‚ ‚ in der Standard-Kodierung nicht dem Zeichen mit ASCII-Code 32 entspricht (dieses wird von trim() entfernt), sondern dem Zeichen mit ASCII-Code 160 (0xa0).
Genaugenommen verhält sich hier PHP vollkommen korrekt, denn ein Non-Breaking-Space entspricht eben dem ASCII-Code 160. Und der wird leider nicht von trim in der Standardkonfiguration entfernt (siehe 2. Parameter). Auf Stackoverflow wurde das auch diskutiert und zu solch barbarischen Methoden wie str_replace geraten.