74 votes

Split camelCase parole en mots avec php preg_match (Expression Régulière)

Comment pourrais-je aller sur le fractionnement de la parole:

oneTwoThreeFour

dans un tableau afin que je puisse obtenir:

one Two Three Four

avec preg_match ?

Je me lasse de cela, mais il donne juste le mot en entier

$words = preg_match("/[a-zA-Z]*(?:[a-z][a-zA-Z]*[A-Z]|[A-Z][a-zA-Z]*[a-z])[a-zA-Z]*\b/", $string, $matches)`;

83voto

codaddict Points 154968

Vous pouvez également utiliser preg_match_all comme:

preg_match_all('/((?:^|[A-Z])[a-z]+)/',$str,$matches);

Voir

Explication:

(        - Start of capturing parenthesis.
 (?:     - Start of non-capturing parenthesis.
  ^      - Start anchor.
  |      - Alternation.
  [A-Z]  - Any one capital letter.
 )       - End of non-capturing parenthesis.
 [a-z]+  - one ore more lowercase letter.
)        - End of capturing parenthesis.

83voto

codaddict Points 154968

Vous pouvez utiliser preg_split comme:

$arr = preg_split('/(?=[A-Z])/',$str);

Voir

Je suis fondamentalement de fractionnement de la chaîne d'entrée juste avant la lettre majuscule. L'expression régulière utilisée (?=[A-Z]) correspond au point juste avant une lettre majuscule.

55voto

ridgerunner Points 14773

Je sais que c'est une vieille question avec un accepté de répondre, mais à mon humble avis il y a une meilleure solution:

<?php // test.php Rev:20140412_0800
$ccWord = 'NewNASAModule';
$re = '/(?#! splitCamelCase Rev:20140412)
    # Split camelCase "words". Two global alternatives. Either g1of2:
      (?<=[a-z])      # Position is after a lowercase,
      (?=[A-Z])       # and before an uppercase letter.
    | (?<=[A-Z])      # Or g2of2; Position is after uppercase,
      (?=[A-Z][a-z])  # and before upper-then-lower case.
    /x';
$a = preg_split($re, $ccWord);
$count = count($a);
for ($i = 0; $i < $count; ++$i) {
    printf("Word %d of %d = \"%s\"\n",
        $i + 1, $count, $a[$i]);
}
?>

Sachez que cette expression, (comme codaddict de l' '/(?=[A-Z])/' solution qui fonctionne comme un charme pour bien formé camelCase mots), ne correspond qu'à un poste au sein de la chaîne et consomme pas de texte du tout. Cette solution a l'avantage supplémentaire qu'il fonctionne correctement pour le pas-si-bien-formé pseudo-camelcase des mots tels que: StartsWithCap et de: hasConsecutiveCAPS.

Entrée:

oneTwoThreeFour
StartsWithCap
hasConsecutiveCAPS
NewNASAModule

Sortie:

Word 1 of 4 = "one"
Word 2 of 4 = "Two"
Word 3 of 4 = "Three"
Word 4 of 4 = "Four"

Word 1 of 3 = "Starts"
Word 2 of 3 = "With"
Word 3 of 3 = "Cap"

Word 1 of 3 = "has"
Word 2 of 3 = "Consecutive"
Word 3 of 3 = "CAPS"

Word 1 of 3 = "New"
Word 2 of 3 = "NASA"
Word 3 of 3 = "Module"

Modifié: 2014-04-12: Modifié regex, de script et de données de test correctement split: "NewNASAModule" des cas (en réponse à rr commentaire).

13voto

blak3r Points 5096

Un functionized version de @ridgerunner de réponse.

/**
 * Converts camelCase string to have spaces between each.
 * @param $camelCaseString
 * @return string
 */
function fromCamelCase($camelCaseString) {
        $re = '/(?<=[a-z])(?=[A-Z])/x';
        $a = preg_split($re, $camelCaseString);
        return join($a, " " );
}

8voto

ArtisticPheonix Points 21
$string = preg_replace( '/([a-z0-9])([A-Z])/', "$1 $2", $string );

Le truc, c'est un modèle reproductible $1 $2$1 $2 ou moins UPPERlower UPPERlower etc.... par exemple helloWorld = $1 correspond à "bonjour", $2 correspond à "W" et $1 correspond à "mondiale" de nouveau donc, en bref, vous obtenez $1 $2$1 ou "hello World", correspond à HelloWorld que $2$1 $2$1 ou encore "Hello World". Ensuite, vous pouvez réduire les cas les mettre en majuscule le premier mot ou de les faire exploser sur l'espace, ou d'utiliser un _ ou un autre caractère à les garder séparés.

Court et simple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X