Метод PHP для удаления повторяющихся символов из многобайтовой строки?
-
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 для удаления дубликатов.Довольно просто.Ничего сложного.Мне это нравится.