我想通过将单词通过其大写字母分解,例如:
<?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"
我该如何完成?我找不到任何问题,所以提问。
,尽管@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的LookAhead中。
编辑:
这里有一些测试用例。只有最后一个可能不是我们想要的。
<?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
这检查了下一个字母不是大写
$classname_arr = preg_split('/(?=[A-Z][^A-Z])/', $classname);
$slug = strtolower(implode("-", array_filter($classname_arr))); // outputs "my-big-class"
echo $slug;
注意:使用array_filter()删除空元素