Question

Arrrgh. Est-ce que quelqu'un sait comment créer une fonction qui est l'équivalent de caractères multi -yte de la commande php count_chars ($ string, 3)?

De sorte qu'il renverra une liste d'une seule instance de chaque caractère unique. Si c'était anglais et que nous avions

"aaabggxxyxzxxggggghq xcccxxxzxyx"

Il retournerait "Abgh Qxyz" (notez que l'espace est compté).

(L'ordre n'est pas important dans ce cas, peut être n'importe quoi).

Si le kanji japonais (je ne sais pas les navigateurs soutiendront tous ceci):

漢漢 漢字 漢字 私私字 私字 漢字 私 漢字 漢字 私

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

漢字 私

Il doit fonctionner sur n'importe quelle chaîne codée UTF-8.

Était-ce utile?

La solution

Hey 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, tu pensais que j'allais utiliser mb_substr encore?

Dans Regex-Speak, il recherche un seul personnage, puis un ou plusieurs instances de ce même personnage. La région appariée est ensuite remplacée par le seul personnage qui correspond.

La u modificateur Allume le mode UTF-8 dans PCRE, dans lequel il traite Séquences UTF-8 au lieu de caractères 8 bits. Tant que la chaîne traitée est déjà UTF-8 et Le PCRE a été compilé avec le support Unicode, cela devrait bien fonctionner pour vous.


Hey 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));

Cela utilise la même astuce générale que le code Shuffle. Nous saisissons la longueur de la chaîne, puis utilisons mb_substr pour l'extraire un personnage à la fois. Nous utilisons ensuite ce caractère comme clé dans un tableau. Nous profitons des tableaux de position 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 saisissons les clés et nous joignons ensemble dans le même ordre qu'ils sont apparus dans la chaîne. Vous obtenez également un nombre de personnages par personnage à partir de cette technique.

Cela aurait été beaucoup plus facile s'il y avait une chose telle que mb_str_split Accompagner str_split.

(Aucun exemple de Kanji ici, je connais un bug de copie / coller.)


Ici, essayez ceci pour la taille:

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 ça deux fois, la deuxième fois avec la chaîne gauche à droite et la chaîne de droite à gauche. La sortie sera différente - array_diff Vous donne juste les trucs du côté gauche qui manque à droite, vous devez donc le faire deux fois pour obtenir toute l'histoire.

Autres conseils

Veuillez essayer de vérifier le iconv_strlen Fonction de bibliothèque standard PHP. Je ne peux pas dire sur les encodages Orient, mais cela fonctionne bien pour les langues européennes et européennes de l'Europe. En tout cas, cela donne une certaine liberté!

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

Beaucoup plus facile. Utilisateur STR_SPLIT pour transformer la phrase en un tableau avec chaque caractère comme élément. Utilisez ensuite Array_Unique pour supprimer les doublons. Assez simple. Rien de compliqué. Je l'aime comme ça.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top