La respuesta de DigitalRoss no reconocerá siglas incrustados en el CamelCase. Por ejemplo, dividirá "MyHTMLTricks" en "My H T M L Tricks" en lugar de "My HTML Tricks".
Aquí es otra opción basada en la función AsSpaced()
en PmWiki, lo que hace un gran trabajo de ser sensible a casos como éste:
"MyHTMLTricks" \
.gsub(/([[:lower:]\\d])([[:upper:]])/, '\1 \2') \
.gsub(/([^-\\d])(\\d[-\\d]*(|$))/,'\1 \2') \
.gsub(/([[:upper:]])([[:upper:]][[:lower:]\\d])/, '\1 \2')
=> "My HTML Tricks"
La otra cosa que me gusta de este enfoque es que deja la cadena una cuerda, en lugar de transformarla en una matriz. Si realmente quieres la matriz, simplemente agrega una división al final.
"MyHTMLTricks" \
.gsub(/([[:lower:]\\d])([[:upper:]])/, '\1 \2') \
.gsub(/([^-\\d])(\\d[-\\d]*(|$))/,'\1 \2') \
.gsub(/([[:upper:]])([[:upper:]][[:lower:]\\d])/, '\1 \2') \
.split
=> ["My", "HTML", "Tricks"]
Para el registro, aquí está el código PHP original de PmWiki.
function AsSpaced($text) {
$text = preg_replace("/([[:lower:]\\d])([[:upper:]])/", '$1 $2', $text);
$text = preg_replace('/([^-\\d])(\\d[-\\d]*(|$))/', '$1 $2', $text);
return preg_replace("/([[:upper:]])([[:upper:]][[:lower:]\\d])/", '$1 $2', $text);
}
¿Qué le gustaría hacer con 'ThisIsANarrowImageOfHIV?' Hacer una unión con n, o dividir el VIH? –