2012-05-08 46 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的回答中找到一些更復雜的選擇。