2013-06-28 35 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