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.