2010-07-18 3 views
5

Im Moment bin die Umsetzung ich dies mit einem Split, in Scheiben schneiden und Implosion:Explodieren UpperCasedCamelCase nach Obermantel Camel Case in PHP

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

Prettier Version:

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

jedoch das Problem ist, wenn Sie Eingaben wie 'SometimesPDFFilesHappen' haben, die meine Implementierung (fälschlicherweise) als 'Sometimes P D F Files Happen' interpretieren würde.

Wie kann ich (einfach) mein Skript 'P D F' zu 'PDF' kondensieren?

Meine Qualifikation für, wenn es geteilt werden sollte, würde in der ersten Hauptstadt beginnen und vor der letzten enden, um das nächste Wort unterzubringen.

Ja, ich weiß, dass es einige Unklarheiten gibt, wie in 'ThisIsAPDFTest', die als 'This Is APDF Test' interpretiert werden würde. Ich kann mir jedoch keinen "intelligenten" Weg vorstellen, dies zu vermeiden, daher ist es ein akzeptabler Kompromiss.

+0

Siehe auch: http://stackoverflow.com/questions/3103730/is-there-a-egegant-way-to-parse-a-word-and-add-spaces-before-capital-letters/3103795 # 3103795 –

Antwort

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; 

oder, wenn Sie sehr religiös sind etwa 1 Erklärung mit:

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

die sehr hässlich.

+1

+1 du hast mir das Schreiben einer Frage gerettet und dann für ein Duplikat geschlagen. – zaf

+0

++; Danke, das hat alle meine Unit-Tests bestanden, dass andere Algorithmen fehlgeschlagen sind. Ich muss wirklich Regex lernen. – Dolph

+0

Ich habe einen Komponententest für meine eigenen Zwecke hinzugefügt und das erste Argument von pass1 durch "/ ([a-z]) ([A-Z] [a-z]) /" ersetzt, um zu verhindern, dass "FoO" durch "Fo O" ersetzt wird. – Dolph