2012-05-08 37 views
8

我使用这个功能,驼峰转换为字符串虚线:驼峰冲 - 两个首都相邻

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

+0

在这种情况下,你是对的,但它不会发生。谢谢 – simPod

+0

这不是camelCase。这是PascalCase btw。 –

回答

26

使用lookahead assertion

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

看到它联机工作:ideone

6

你并不需要一个超前的断言来做到这一点,如果你知道你的字符串不上启动

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

这仍然不会处理这样@sfjedi情况: - 案例信,你可以每个大写字母像这样前插入一个连字符的“companyHQ” - >“company-hq”。为此,您必须明确地测试不允许拆分的允许大写的子字符串,或者指定一些通用规则(例如,不要在最后一个字符前加上连字符)。

你可以在这个virtual duplicate question的回答中找到一些更复杂的选择。