Метод PHP для удаления повторяющихся символов из многобайтовой строки?

StackOverflow https://stackoverflow.com/questions/5413655

  •  29-10-2019
  •  | 
  •  

Вопрос

А-р-р.Кто-нибудь знает, как создать функцию, которая является эквивалентом многобайтовых символов команды PHP count_chars ($ string, 3)?

Таким образом, он будет возвращать список ТОЛЬКО ОДИН ЭКЗЕМПЛЯР каждого уникального символа.Если бы это был английский язык и у нас

«aaabggxxyxzxxgggghq xcccxxxzxxyx»

Он вернет "abgh qxyz" (обратите внимание на подсчитанное количество пробелов).

(Порядок в данном случае не важен, может быть любым).

Если японские кандзи (не уверен, что все браузеры это поддерживают):

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

И он вернет только 3 использованных иероглифа:

漢字 私

Он должен работать с любой строкой в кодировке UTF-8.

Это было полезно?

Решение

Привет, Дэйв, ты никогда не увидишь этого .

общий

Что, вы думали, я снова буду использовать кодовый код?

В языке регулярных выражений он ищет любой один символ, а затем один или несколько экземпляров этого же символа. Соответствующая область затем заменяется одним совпадающим символом.

модификатор mb_substr включает UTF-8 режим в PCRE, в котором он работает с последовательностями UTF-8 вместо 8-битных символов. Пока обрабатываемая строка уже имеет формат UTF-8 и PCRE был скомпилирован с поддержкой Unicode, это должно работать для вас.


Эй, угадайте что!

общий

Здесь используется тот же общий трюк, что и при случайном кодировании. Мы берем длину строки, а затем используем код u, чтобы извлекать ее по одному символу за раз. Затем мы используем этот символ как ключ в массиве. Мы пользуемся преимуществами позиционных массивов PHP: ключи сортируются в том порядке, в котором они определены. После того, как мы перебрали строку и идентифицировали все символы, мы берем ключи и соединяем их вместе в том же порядке, в котором они появлялись в строке. Вы также можете рассчитать количество символов для каждого символа с помощью этого метода.

Это было бы намного проще, если бы существовала такая вещь, как mb_substr вместе с генерировать код тега .

(Здесь нет примера кандзи, у меня возникла ошибка копирования / вставки.)


Вот примерьте это на размер:

общий

Вы захотите вызвать это дважды , второй раз с левой строкой справа и правой строкой слева. Результат будет другим - mb_str_split просто дает вам то, что в левой части отсутствует справа, поэтому вам придется сделать это дважды, чтобы получить всю историю.

Другие советы

Попробуйте проверить функцию стандартной библиотеки PHP iconv_strlen .Не могу сказать о кодировках востока, но для европейских и восточноевропейских языков работает нормально.В любом случае дает некоторую свободу!

общий

Намного проще.Пользователь str_split превращает фразу в массив с каждым символом в качестве элемента.Затем используйте array_unique для удаления дубликатов.Довольно просто.Ничего сложного.Мне это нравится.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top