17

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

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

它有点工作,但是当我有前任时有问题。这个字符串:getADog。它回来了get-adog,但我想要get-a-dog

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

4

2 回答 2

37

使用前瞻断言

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

在线查看它:ideone

于 2012-05-08T23:08:43.433 回答
8

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

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

这仍然无法处理@sfjedi 的“companyHQ”->“company-hq”之类的情况。为此,您必须明确测试不应该拆分的允许的大写子字符串,或指定一些通用规则(例如,不要在最后一个字符之前添加连字符)。

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

于 2012-05-08T23:28:49.937 回答