在PHP

2010-07-18 56 views
5

爆炸UpperCasedCamelCase到上圍護駝峯現在,我有分流,切片和內爆實現這個當你有像'SometimesPDFFilesHappen'這樣的輸入時,我的實現將(錯誤地)解釋爲'Sometimes P D F Files Happen'在PHP

我該如何(簡單地)讓我的腳本將'P D F'濃縮爲'PDF'

我應該分裂的條件是從第一個首都開始,最後一個結束,以適應下一個詞。

是的,我知道有一些含糊之處,如'ThisIsAPDFTest',這將被解釋爲'This Is APDF Test'。但是,我想不出一個「聰明」的方式來避免這種情況,所以這是一個可以接受的折中方案。

+0

另見: http://stackoverflow.com/questions/3103730/is-there-a-elegant-way-to-parse-a-word-and-add-spaces-before-capital-letters/3103795 #3103795 – 2010-07-18 15:18:58

回答

10
$input = "SomePDFFile"; 

$pass1 = preg_replace("/([a-z])([A-Z])/","\\1 \\2",$input); 
$pass2 = preg_replace("/([A-Z])([A-Z][a-z])/","\\1 \\2",$pass1); 
echo $pass2; 

,或者,如果你對有1個語句非常虔誠:

preg_replace("/(([a-z])([A-Z])|([A-Z])([A-Z][a-z]))/","\\2\\4 \\3\\5",$input); 

這是非常難看。

+1

+1你救了我寫一個問題,然後得到一個重複拍打。 – zaf 2010-10-01 15:01:42

+0

++;謝謝,這通過了我所有的單元測試,其他算法都失敗了。我真的需要學習正則表達式。 – Dolph 2010-11-14 01:31:51

+0

爲我自己的目的添加了單元測試,並將「pass1」上的第一個參數替換爲「/([a-z])([A-Z] [a-z])/」,以防止將FoO替換爲Fo O。 – Dolph 2010-11-14 01:53:34