嘿戴夫,你永远不会看到这一个来.
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
什么,你以为我会再次使用mb_substr?
在正则表达式中,它正在寻找任何一个字符,然后是同一个字符的一个或多个实例.然后将匹配的区域替换为匹配的一个字符.
u modifier在PCRE中打开UTF-8模式,其中它处理UTF-8序列而不是8位字符.只要正在处理的字符串已经是UTF-8并且PCRE是使用Unicode支持编译的,这对你来说应该可以正常工作.
嘿,你猜怎么着!
$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));
这使用与shuffle代码相同的一般技巧.我们获取字符串的长度,然后使用mb_substr一次提取一个字符.然后我们将该字符用作数组中的键.我们正在利用PHP的位置数组:键按照它们的定义顺序排序.一旦我们浏览完字符串并识别出所有字符,我们就会按照它们出现在字符串中的顺序抓住键并加入.您还可以通过此技术获得每个字符的字符数.
如果像mb_str_split这样的东西与str_split一起出现,这将会容易得多.
(这里没有Kanji示例,我遇到了复制/粘贴错误.)
在这里,尝试这个大小:
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
)
*/
你需要调用两次,第二次调用左边的字符串,右边的字符串调用左边的字符串.输出将是不同的 – array_diff只是给你左边缺少的东西,所以你必须做两次才能得到整个故事.