Viendo la lógica de la función, me parece que no tiene mucha lógica, porque:
1. Cortas la cadena sin tomar en cuenta si se va a cortar una palabra o no
2. No me queda claro porque se usa una expresión regular y preg_split() en lugar de explode(). Hay la posibilidad de que en la cadena existan entidades HTML como ? Entonces creo que faltan validaciones al crear el contenido
3. Uso de preg_match() para saber si la cadena tenía un espacio al final o no y, dependiendo de eso,
borrar el último elemento. Esto debió solventarlo el trim() y, además, estoy 99.99% seguro de que el punto 1 y este son la causa de tu problema y no los "caracteres raros" que, realmente, no son tan raros, pero eso es otro tema
Cita:
Iniciado por Ember No tengo claro qué tendría que tocar en esa función para que salgan palabras con caracteres especiales, o si merece la pena usar otra función.
Creo que lo que merece la pena es entender qué hace cada cosa para poder aplicar los cambios necesarios.
Sugerencia:
1. Separa la cadena por espacios, solo con explode()
2. Podrías usar
array_map() para recorrer los elementos y crear la nueva cadena