如何通过大写字母拆分骆驼字符串,但忽略缩写词

时间:2017-09-08 16:50:44

标签: php

我希望通过分解他们的首都的话来缓和一个骆驼状的字符串,如下所示:

<?php
$classname = "MyBigClass";
$classname_arr = preg_split('/(?=[A-Z])/', $classname);
$slug = strtolower(implode("-",$classname_arr)); // outputs "my-big-class"
?>

但我不想让它分解缩略词:

<?php
$classname = "FAQList";
... // outputs "f-a-q-list", I want it to be "faq-list"

我如何做到这一点?我找不到任何相关的SO问答。

2 个答案:

答案 0 :(得分:3)

这会检查下一个不是大写的字母

$classname_arr = preg_split('/(?=[A-Z][^A-Z])/', $classname);
$slug = strtolower(implode("-", array_filter($classname_arr))); // outputs "my-big-class"
echo $slug;

注意:使用array_filter()删除空元素

答案 1 :(得分:3)

虽然@Wee Zel的答案已经被接受(并且有充分的理由)我想提出一个扩展,这也适用于像MyFAQ这样的案例:

<?php
$classname = "MyFAQ";
$classname_arr = preg_split('/(?=[A-Z][^A-Z])|(?<![A-Z])(?=[A-Z])/', $classname);
$slug = strtolower(implode("-", array_filter($classname_arr))); // outputs "my-faq"
echo $slug;

我只是将我的第一次尝试与Wee Zel先生的评论(负面的背后)结合起来。

修改

这里有一些测试用例。只有最后一个可能不是我们想要的。

<?php
$classnames = Array("MyFAQ", "myFAQ", "FAQList","myClassName", "youHaveAProblem", "MyClassNNName");

function splitCamelCase($classname) {
   $classname_arr = preg_split('/(?=[A-Z][^A-Z])|(?<![A-Z])(?=[A-Z])/', $classname);
   $slug = strtolower(implode("-", array_filter($classname_arr))); // outputs "my-faq"
   return $slug;
}


foreach($classnames as $classname) {
    echo splitCamelCase($classname)."<br>\n";
}

// output:
// my-faq
// my-faq
// faq-list
// my-class-name
// you-have-a-problem
// my-class-nn-name