在PHP中将大写驼峰命名法拆分为大写的单词并用空格隔开

5

现在,我正在使用分割、切片和合并的方法来实现这个功能:

$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'。但是,我想不出一个“聪明”的方法来避免这种情况,所以这是一个可以接受的妥协。

请参阅: https://dev59.com/9nA75IYBdhLWcg3wy8Qi#3103795 - Peter Boughton
1个回答

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;

或者,如果你非常在意只有一条语句:

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

这非常丑陋。


1
+1 你救了我一命,省得我发重复问题还被打。 - zaf
++;谢谢,这通过了其他算法失败的所有单元测试。我真的需要学习正则表达式。 - Dolph
为了自己的目的添加了一个单元测试,并在pass1中将第一个参数替换为 "/([a-z])([A-Z][a-z])/",以防止 "FoO" 被替换为 "Fo O"。 - Dolph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接