5 votes

Méthode PHP pour supprimer les caractères en double d'une chaîne de caractères multioctets ?

Arrrgh. Quelqu'un sait-il comment créer une fonction qui soit l'équivalent en caractères multi-octets de la commande PHP count_chars($string, 3) ?

De telle sorte qu'il renvoie une liste de SEULEMENT UNE INSTANCE de chaque caractère unique. Si c'était l'anglais et que nous avions

"aaabggxxyxzxxgggghq xcccxxxzxxyx"

Il renverrait "abgh qxyz" (l'espace est compté).

(L'ordre n'est pas important dans ce cas, il peut s'agir de n'importe quoi).

Si les kanji japonais (il n'est pas certain que tous les navigateurs prennent en charge cette fonction) :

Et il ne renverra que les 3 kanji utilisés :

Il doit fonctionner avec n'importe quelle chaîne encodée en UTF-8.

4voto

Charles Points 33585

Hé Dave, tu ne verras jamais cette un à venir.

php > $kanji = '漢漢漢字漢字私私字私字漢字私漢字漢字私';
php > $not_kanji = 'aaabcccbbc';
php > $pattern = '/(.)\1+/u';
php > echo preg_replace($pattern, '$1', $kanji);
漢字漢字私字私字漢字私漢字漢字私
php > echo preg_replace($pattern, '$1', $not_kanji);
abcbc

Quoi, vous pensiez que j'allais utiliser mb_substr encore ?

En termes de regex, il s'agit de rechercher un caractère, puis une ou plusieurs occurrences de ce même caractère. La région correspondante est ensuite remplacée par le caractère correspondant.

T u modificateur active le mode UTF-8 dans PCRE, dans lequel il traite avec Séquences UTF-8 au lieu de caractères de 8 bits. Tant que la chaîne en cours de traitement est déjà UTF-8 et PCRE a été compilé avec le support de l'Unicode, cela devrait fonctionner pour vous.


Hé, devinez quoi !

$not_kanji = 'aaabbbbcdddbbbbccgggcdddeeedddaaaffff';
$l = mb_strlen($not_kanji);
$unique = array();
for($i = 0; $i < $l; $i++) {
    $char = mb_substr($not_kanji, $i, 1);
    if(!array_key_exists($char, $unique))
        $unique[$char] = 0;
    $unique[$char]++;
}
echo join('', array_keys($unique));

Ce code utilise la même astuce générale que le code "shuffle". Nous prenons la longueur de la chaîne, puis nous utilisons mb_substr pour l'extraire caractère par caractère. Nous utilisons ensuite ce caractère comme clé dans un tableau. Nous tirons parti des tableaux positionnels de PHP : les clés sont triées dans l'ordre où elles sont définies. Une fois que nous avons parcouru la chaîne et identifié tous les caractères, nous récupérons les clés et les joignons dans l'ordre dans lequel elles sont apparues dans la chaîne. Cette technique permet également d'obtenir un nombre de caractères par caractère.

Cela aurait été beaucoup plus facile s'il existait une chose telle que mb_str_split pour accompagner str_split .

(Pas d'exemple de Kanji ici, je suis victime d'un bug de copier/coller).


Tenez, essayez ceci pour voir :

function mb_count_chars_kinda($input) {
    $l = mb_strlen($input);
    $unique = array();
    for($i = 0; $i < $l; $i++) {
        $char = mb_substr($input, $i, 1);
        if(!array_key_exists($char, $unique))
            $unique[$char] = 0;
        $unique[$char]++;
    }
    return $unique;
}

function mb_string_chars_diff($one, $two) {
    $left = array_keys(mb_count_chars_kinda($one));
    $right = array_keys(mb_count_chars_kinda($two));
    return array_diff($left, $right);
}

print_r(mb_string_chars_diff('aabbccddeeffgg', 'abcde'));
/* => 
Array
(
    [5] => f
    [6] => g
)
*/

Vous voudrez appeler ceci deux fois La deuxième fois avec la corde gauche à droite et la corde droite à gauche. Le résultat sera différent -- array_diff ne vous donne que les éléments du côté gauche qui manquent dans le côté droit, de sorte que vous devez le faire deux fois pour obtenir toute l'histoire.

0voto

Igor Points 1364

Essayez de vérifier le iconv_strlen Fonction de la bibliothèque standard de PHP. Je ne peux pas dire ce qu'il en est des encodages orientaux, mais cela fonctionne bien pour les langues européennes et d'Europe de l'Est. En tout cas, cela donne une certaine liberté !

0voto

HoldOffHunger Points 1
$name = "My string";
$name_array = str_split($name);
$name_array_uniqued = array_unique($name_array);
print_r($name_array_uniqued);

C'est beaucoup plus facile. Utilisez str_split pour transformer la phrase en un tableau dont chaque caractère est un élément. Utilisez ensuite array_unique pour supprimer les doublons. C'est assez simple. Rien de compliqué. C'est ce que j'aime.

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