2010-07-18 4 views
5

En ce moment, je mets en œuvre cela avec une scission, tranche et implosion:Exploding UpperCasedCamelCase à Upper Cased CamelCase en PHP

$exploded = implode(' ',array_slice(preg_split('/(?=[A-Z])/','ThisIsATest'),1)); 
//$exploded = "This Is A Test" 

Version Prettier:

$capital_split = preg_split('/(?=[A-Z])/','ThisIsATest'); 
$blank_first_ignored = array_slice($capital_split,1); 
$exploded = implode(' ',$blank_first_ignored); 

Cependant, le problème est lorsque vous avez entré comme 'SometimesPDFFilesHappen', que mon implémentation interpréterait (incorrectement) comme 'Sometimes P D F Files Happen'.

Comment puis-je (simplement) faire condenser mon script 'P D F' à 'PDF'? Ma qualification pour quand il devrait diviser serait de commencer à la première capitale, et terminer une avant la dernière, pour accueillir le mot suivant. Oui, je sais qu'il y a des ambiguïtés, comme dans 'ThisIsAPDFTest', qui serait interprété comme 'This Is APDF Test'. Cependant, je ne peux pas penser à un moyen "intelligent" pour éviter cela, c'est donc un compromis acceptable.

+0

Voir aussi: http://stackoverflow.com/questions/3103730/-there-a-elegant-way-to-parse-a-word-and-add-spaces-before-capital-letters/3103795 # 3103795 –

Répondre

10
$input = "SomePDFFile"; 

$pass1 = preg_replace("/([a-z])([A-Z])/","\\1 \\2",$input); 
$pass2 = preg_replace("/([A-Z])([A-Z][a-z])/","\\1 \\2",$pass1); 
echo $pass2; 

ou, si vous êtes très religieux d'avoir une déclaration:

preg_replace("/(([a-z])([A-Z])|([A-Z])([A-Z][a-z]))/","\\2\\4 \\3\\5",$input); 

qui est très laid.

+1

+1 vous m'avez sauvé en écrivant une question et en me faisant gifler pour un doublon. – zaf

+0

++; Merci, cela a passé tous mes tests unitaires que d'autres algorithmes ont échoué. J'ai vraiment besoin d'apprendre le regex. – Dolph

+0

Ajout d'un test unitaire à mes propres fins, et remplacé le premier argument sur pass1 par "/ ([a-z]) ([A-Z] [a-z]) /" pour empêcher "FoO" d'être remplacé par "Fo O". – Dolph

Questions connexes