骆驼案例破折号 - 两个大写字母彼此相邻


camelCase to dash - two capitals next to each other

我正在使用此函数将驼峰转换为虚线字符串:

function camel2dashed($className) {
    return strtolower(preg_replace('/([^A-Z-])([A-Z])/', '$1-$2', $className));
}

它有点工作,但是当我有例如这个字符串时有问题:getADog.它返回get-adog但我想get-a-dog

我应该如何更改我的代码?谢谢

使用前瞻断言:

function camel2dashed($className) {
    return strtolower(preg_replace('/([a-zA-Z])(?=[A-Z])/', '$1-', $className));
}

在线查看它的工作:ideone

如果您知道字符串不以大写字母开头,则不需要前瞻断言即可执行此操作,只需在每个大写字母之前插入连字符即可,如下所示:

function camel2dashed($className) {
    return strtolower(preg_replace('/([A-Z])/', '-$1', $className));
}

这仍然无法处理像@sfjedi的"公司总部">"公司总部"这样的情况。为此,您必须显式测试不应拆分的允许的大写子字符串,或指定一些通用规则(例如,不要在最后一个字符之前加上连字符)。

您可以在此虚拟重复问题的答案中找到一些更复杂的替代方案。

function camel2dash($name) {
   return ltrim(strtolower(preg_replace('/[A-Z]([A-Z](?![a-z]))*/', '-$0', $name)), '-');
}

希望处理所有边缘情况:

SomeOfTheWords → some-of-the-words
getADog → get-a-dog
ADog → a-dog
aDog → a-dog
XML → xml
SimpleXMLReader → simple-xml-reader