2013-06-28 3 views
3

j'ai réussi à mettre en œuvre une fonction qui convertit le cas de chameau aux mots, en utilisant la solution proposée par @ridgerunner dans cette question:Combiner des expressions régulières pour séparer la chaîne de camelCase en mots

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

Cependant, je veux pour gérer également intégrés comme celui-ci Abreviations:

'hasABREVIATIONEmbedded' se traduit par «Est-ce que ABRÉVIATIONS embedded

je suis venu avec cette solution:

<?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"; 
    } 

La sortie est:

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' 

Il fonctionne comme prévu.

Ma question est: Puis-je combiner les 2 expressions régulières $ abreviationsPattern et camelCasePattern donc j'évite de recourir à la fonction preg_split() deux fois?

+0

Pourquoi utilisez-vous le modificateur 'x' quand vous évitez ensuite tous les espaces par concaténation et en utilisant des commentaires PHP au lieu de commentaires regex? Le point de trou de 'x' est que vous pouvez passer votre expression sous la forme d'une chaîne multiligne, avec des commentaires' # ... '. –

+0

Je n'étais pas au courant de la signification de \ x. J'ai copié le motif de la source mentionnée et développée à partir de là. Merci pour votre info. – stou

Répondre

1

Ce sont toujours des puzzles amusants à résoudre; J'ai PRECISEE les cas à deux:

  1. Detect mots qui commencent par une majuscule suivie par des lettres minuscules (mais pas précédée d'une limite de mot ou début du sujet) - (?<!\b)[A-Z][a-z]+

  2. détecter des transitions de minuscules en majuscules - (?<=[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); 
    } 
    

Il fonctionne pour les entrées que vous avez données; cela pourrait échouer cas que je n'ai pas prévu :)

+0

Merci. Fonctionne comme un charme. Je savais qu'il y avait une meilleure solution que ce que je pouvais trouver :-) A dû utiliser create_function() pour permettre l'exécution sur php5.2, et enveloppé dans un appel à ucfirst() – stou

Questions connexes