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).