【问题标题】:Exploding UpperCasedCamelCase to Upper Cased Camel Case in PHP在 PHP 中将大写 CamelCase 分解为大写 CamelCase
【发布时间】:2011-03-17 14:12:57
【问题描述】:

现在,我正在使用拆分、切片和内爆来实现这一点:

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

【问题讨论】:

标签: php regex text-processing


【解决方案1】:
$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;

或者,如果您对拥有 1 个声明非常虔诚:

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

这很丑。

【讨论】:

  • +1 你帮我写了一个问题,然后因为重复而被打脸。
  • ++;谢谢,这通过了我所有其他算法失败的单元测试。我真的需要学习正则表达式。
  • 为我自己的目的添加了一个单元测试,并将 pass1 上的第一个参数替换为 "/([az])([AZ][az])/" 以防止 "FoO" 被替换用“Fo O”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多