我希望通过分解他们的首都的话来缓和一个骆驼状的字符串,如下所示:
<?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问答。
答案 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