94 votes

Obtenir la première lettre de chaque mot dans une chaîne de caractères

Comment puis-je obtenir la première lettre de chaque mot d'une chaîne donnée ?

$string = "Community College District";
$result = "CCD";

J'ai trouvé la méthode javascript mais je ne savais pas comment la convertir en php.

1 votes

Voulez-vous savoir comment obtenir la première lettre de votre chaîne de caractères, conformément à la formulation de votre question, ou comment obtenir la première lettre de chaque mot, conformément à votre exemple ? Dans le premier cas : $result = $string[0].

0 votes

Vous êtes sûr que chaque mot est séparé par un seul espace ? What__about__this__sentence? o What about.This sentence?

0 votes

Franchement, développez votre propre script en PHP.

163voto

Michael Berkowski Points 137903

explode() sur les espaces, puis vous utilisez le [] pour accéder aux chaînes de caractères résultantes sous forme de tableaux :

$words = explode(" ", "Community College District");
$acronym = "";

foreach ($words as $w) {
  $acronym .= $w[0];
}

Si vous vous attendez à ce que plusieurs espaces séparent les mots, utilisez plutôt la fonction preg_split()

$words = preg_split("/\s+/", "Community College District");

Ou si des caractères autres que des espaces délimitent les mots ( -,_ ) par exemple, utilisez preg_split() également :

// Delimit by multiple spaces, hyphen, underscore, comma
$words = preg_split("/[\s,_-]+/", "Community College District");

52voto

DaveRandom Points 45661

La meilleure façon d'y parvenir est d'utiliser des expressions régulières.

Décomposons ce que vous voulez d'une manière logique : Vous voulez que chaque caractère de la chaîne soit au début d'un mot. La meilleure façon d'identifier ces caractères est de chercher ceux qui sont précédés d'un espace blanc.

Nous commençons donc par un lookbehind pour ce caractère d'espace, suivi d'un caractère quelconque :

/(?<=\s)./

Cela permet de trouver tout caractère précédé d'un espace. Mais - le premier caractère de la chaîne est un caractère de la chaîne que vous voulez extraire. Et parce que c'est le premier caractère de la chaîne, il ne peut pas être précédé d'un espace. Nous voulons donc faire correspondre tout ce qui est précédé d'un espace. o le premier caractère de la chaîne, donc nous ajoutons un assertion de début de sujet :

/(?<=\s|^)./

Maintenant, nous nous rapprochons. Mais que faire si la chaîne de caractères contient des blocs de plusieurs espaces ? Et si elle contient un espace suivi d'un caractère de ponctuation ? Nous ne voulons probablement pas faire correspondre l'un ou l'autre de ces caractères, mais simplement les lettres. Nous pouvons le faire avec un classe de caractères [a-zA-Z] . Et nous pouvons rendre l'expression are insensible à la casse en utilisant l'attribut i modificateur .

On se retrouve donc avec :

/(?<=\s|^)[a-z]/i

Mais comment l'utiliser en PHP ? Eh bien, nous voulons correspondre à tout occurrences de l'expression régulière dans la chaîne de caractères, nous utilisons donc (vous l'avez deviné) preg_match_all() :

$string = "Progress in Veterinary Science";

$expr = '/(?<=\s|^)[a-z]/i';
preg_match_all($expr, $string, $matches);

Maintenant nous avons tous les caractères que nous voulions extraire. Pour construire la chaîne de résultats que vous montrez, nous devons les réunir à nouveau :

$result = implode('', $matches[0]);

...et nous devons nous assurer qu'ils sont tout en majuscules :

$result = strtoupper($result);

Et c'est vraiment tout ce qu'il y a à faire.

Voir le fonctionnement

20voto

Chen Asraf Points 5529

En supposant que les mots sont tous séparés par des espaces, c'est une solution appropriée :

$string = "Progress in Veterinary Science";

function initials($str) {
    $ret = '';
    foreach (explode(' ', $str) as $word)
        $ret .= strtoupper($word[0]);
    return $ret;
}

echo initials($string); // would output "PIVS"

0 votes

Je pense que $word[0] est plus rapide que substr($word,0,1) alors pourquoi utiliser substr($word,0,1) ?

2 votes

Je n'ai pas vraiment confiance dans les chaînes de caractères en tant que tableaux. Des erreurs sont apparues dans le passé.

0 votes

Edit : TL;DR : juste de vieilles habitudes

10voto

Flo-Schield-Bobby Points 1605

Comme expliqué par d'autres, la méthode classique consiste à itérer sur chaque mot de votre chaîne initiale, à réduire le mot à sa première lettre, et à combiner ces premières lettres ensemble.

Voici une méthode d'aide combinant les différentes étapes.

/**
 * @return string
 */
function getInitials($string = null) {
    return array_reduce(
        explode(' ', $string),
        function ($initials, $word) {
            return sprintf('%s%s', $initials, substr($word, 0, 1));
        },
        ''
    );
}

NB : ceci retournera une chaîne vide si la chaîne donnée est vide.

getInitials('Community College District')

chaîne 'CCD' (length=3)

getInitials()

chaîne '' (longueur=0)

getInitials('Lorem ipsum dolor sic amet')

chaîne 'Lidsa' (length=5)

Bien entendu, vous pouvez ajouter des filtres à la fonction de rappel de l'option array_reduce() tels que strtoupper() si vous préférez uniquement des initiales en majuscules par exemple.

10voto

Sverri M. Olsen Points 5033

Il y a beaucoup de explode réponses. Je pense que l'utilisation du strtok est une solution beaucoup plus élégante et efficace en termes de mémoire :

function createAcronym($string) {
    $output = null;
    $token  = strtok($string, ' ');
    while ($token !== false) {
        $output .= $token[0];
        $token = strtok(' ');
    }
    return $output;
}
$string = 'Progress in Veterinary Science';
echo createAcronym($string, false);

Voici une fonction plus robuste et utile, qui prend en charge les caractères UTF8 et l'option de n'utiliser que les mots en majuscules :

function createAcronym($string, $onlyCapitals = false) {
    $output = null;
    $token  = strtok($string, ' ');
    while ($token !== false) {
        $character = mb_substr($token, 0, 1);
        if ($onlyCapitals and mb_strtoupper($character) !== $character) {
            $token = strtok(' ');
            continue;
        }
        $output .= $character;
        $token = strtok(' ');
    }
    return $output;
}
$string = 'Leiðari í Kliniskum Útbúgvingum';
echo createAcronym($string);

0 votes

Je ne suis pas d'accord, votre code est massif comparé aux méthodes explode.

3 votes

@Dale Eh bien, cela nous en dit plus sur vous que sur mon code - l'esthétique est un mauvais moyen d'évaluer le code. En utilisant explode pour résoudre ce problème est ce qu'on appellerait une solution naïve . C'est comme utiliser l'algorithme du tri à bulles juste parce qu'il est facile à mettre en œuvre.

0 votes

@MAssiveAmountsOfCode Je ne suis pas d'accord pourquoi faire quelque chose en 13 lignes de code, qui peut être réalisé en 1. foreach(explode(' ', $string) as $word) echo $word[0]; ? Plus facile à comprendre en un coup d'œil, et pas une perte de temps.

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