2013-06-28 36 views
3

我設法實現駱駝情況下轉換成詞的功能,通過使用這個問題由@ridgerunner建議的解決方案:結合正則表達式分裂駝峯串入的話

Split camelCase word into words with php preg_match (Regular Expression)

不過,我想同時還處理嵌入abreviations這樣的:

「hasABREVIATIONEmbedded」轉化爲「有縮寫符號嵌入式」

我想出了這個解決方案:

<?php 

    function camelCaseToWords($camelCaseStr) 
    { 

     // Convert: "TestASAPTestMore" to "TestASAP TestMore" 

     $abreviationsPattern = '/' . // Match position between UPPERCASE "words" 
      '(?<=[A-Z])' . // Position is after group of uppercase, 
      '(?=[A-Z][a-z])' . // and before group of lowercase letters, except the last upper case letter in the group. 
      '/x'; 
     $arr = preg_split($abreviationsPattern, $camelCaseStr); 
     $str = implode(' ', $arr); 

     // Convert "TestASAP TestMore" to "Test ASAP Test More" 
     $camelCasePattern = '/' . // Match position between camelCase "words". 
      '(?<=[a-z])' . // Position is after a lowercase, 
      '(?=[A-Z])' . // and before an uppercase letter. 
      '/x'; 

     $arr = preg_split($camelCasePattern, $str); 
     $str = implode(' ', $arr); 

     $str = ucfirst(trim($str)); 
     return $str; 
    } 

    $inputs = array(
    'oneTwoThreeFour', 
    'StartsWithCap', 
    'hasConsecutiveCAPS', 
    'ALLCAPS', 
    'ALL_CAPS_AND_UNDERSCORES', 
    'hasABREVIATIONEmbedded', 
    ); 

    echo "INPUT"; 

    foreach($inputs as $val) { 
     echo "'" . $val . "' translates to '" . camelCaseToWords($val). "'\n"; 
    } 

輸出是:

INPUT'oneTwoThreeFour' translates to 'One Two Three Four' 
    'StartsWithCap' translates to 'Starts With Cap' 
    'hasConsecutiveCAPS' translates to 'Has Consecutive CAPS' 
    'ALLCAPS' translates to 'ALLCAPS' 
    'ALL_CAPS_AND_UNDERSCORES' translates to 'ALL_CAPS_AND_UNDERSCORES' 
    'hasABREVIATIONEmbedded' translates to 'Has ABREVIATION Embedded' 

它按預期工作。

我的問題是: 我可以結合2個正則表達式$ abreviationsPattern和camelCasePattern 這樣我就可以避開運行使preg_split()函數兩次?

+0

爲什麼當你通過連接並使用PHP註釋而不是正則表達式來避免所有空白時使用'x'修飾符? 'x'的缺點是你可以用'#...'註釋將你的表達式作爲一個多行字符串傳入。 –

+0

我沒有意識到\ x的含義。我從源代碼中複製了模式,並從那裏擴展。感謝您的信息。 – stou

回答

1

這些總是有趣的謎題來解決;我的情況下縮小到只有兩個:

  1. 檢測與資本後跟小寫字母(但不是以主題的字邊界或開始之前)開始的單詞 - (?<!\b)[A-Z][a-z]+

  2. 檢測從小寫轉換爲大寫 - (?<=[a-z])[A-Z]

    function camelFix($str) 
    { 
        return preg_replace_callback('/(?<!\b)[A-Z][a-z]+|(?<=[a-z])[A-Z]/', function($match) { 
         return ' '. $match[0]; 
        }, $str); 
    } 
    

你的作品都給予了投入;它可能會失敗,我沒有預見到:)

+0

謝謝。奇蹟般有效。我知道有比我能想到的更好的解決方案:-)不得不使用create_function()來允許在php5.2上運行,並且在調用ucfirst() – stou