驼峰命名法转短横线命名法 - 相邻的两个大写字母

18

我正在使用这个函数将驼峰式字符串转换为破折号分隔的字符串:

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

代码有点用,但当我有这样的字符串时(例如:getADog),它返回get-adog,但我想要get-a-dog

我该如何修改代码?谢谢。


2
你有没有考虑过是否想要两个大写字母挨在一起?例如,公司总部的缩写是companyHQ。你肯定不希望变成company-h-q,对吧? - jedmao
在这种情况下,你是正确的,但这不会发生。谢谢。 - simPod
这不是驼峰命名法。顺便说一下,这是帕斯卡命名法。 - ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
3个回答

38

使用先行断言

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

在线查看演示:ideone


8
如果你清楚你的字符串不以大写字母开头,你就不需要使用前瞻断言来实现此功能,你只需要在每个大写字母前面插入一个连字符,像这样:
function camel2dashed($className) {
    return strtolower(preg_replace('/([A-Z])/', '-$1', $className));
}

这仍然无法处理类似@sfjedi的“companyHQ” ->“company-hq”的情况。为此,您必须明确测试不应拆分的允许大写子字符串,或指定一些通用规则(例如,在最后一个字符之前不要添加连字符)。 您可以在这个虚拟重复问题的答案中找到一些更复杂的替代方案。

0
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接