Прямо сейчас я реализую это с разделением, частью и имплозией:
$exploded = implode(' ',array_slice(preg_split('/(?=[A-Z])/','ThisIsATest'),1));
//$exploded = "This Is A Test"
Более симпатичная версия:
$capital_split = preg_split('/(?=[A-Z])/','ThisIsATest');
$blank_first_ignored = array_slice($capital_split,1);
$exploded = implode(' ',$blank_first_ignored);
Однако проблема состоит в том, когда Вы ввели как 'SometimesPDFFilesHappen'
, который моя реализация (неправильно) интерпретировала бы как 'Sometimes P D F Files Happen'
.
Как я могу (просто) заставить свой сценарий уплотнять 'P D F'
кому: 'PDF'
?
Моя квалификация для того, когда это должно разделить, состояла бы в том, чтобы запуститься в первом капитале и закончить тот перед последним, для размещения следующего слова.
Да, я знаю, что существуют некоторые неоднозначности, как в 'ThisIsAPDFTest'
, который был бы интерпретирован как 'This Is APDF Test'
. Однако я не могу думать об "умном" способе избежать этого, таким образом, это - приемлемый компромисс.
$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;
или, если вы очень религиозны по поводу одного утверждения:
preg_replace("/(([a-z])([A-Z])|([A-Z])([A-Z][a-z]))/","\\2\\4 \\3\\5",$input);
, что очень некрасиво.