in_array对相同的字符返回false,单字符串匹配

时间:2017-09-28 10:19:08

标签: php

function make_ascii($str) {
    $special = array('ľ','š','č','ť','ž','ý','á','í','é','ú','ä','ô','ň','ě');
    $ascii =   array('l','s','c','t','z','y','a','i','e','u','a','o','n','e');
    $str = str_split($str);
    foreach ($str as $k => $c) {
        if(ctype_upper($c)) {
            $u = true;
            $c = strtolower($c);
        } else {
            $u = false;
        }
        if(in_array($c, $special, false)) {
            $c = $ascii[array_search($c, $special)];
        }
        if($u) {
            $c = strtoupper($c);
        }
        $str[$k] = $c;
    }
    return join($str);
}

在这个函数中,即使我从$special数组中提供字符,in_array()每次都返回false,如果我想在我尝试解析的常规文本上var_dump(),输出将是只有bool(false)没有马赫,即使我复制粘贴从源到数组。此外,我正在寻找方法让这个角色更换工作。

2 个答案:

答案 0 :(得分:1)

由于str_split不适用于多字节,您必须使用mb_执行多字节字符串操作

function make_ascii($str) {
    //return $str;
    $special = array('ľ','š','č','ť','ž','ý','á','í','é','ú','ä','ô','ň','ě');
    $ascii =   array('l','s','c','t','z','y','a','i','e','u','a','o','n','e');
    $str = array_map(function ($i) use ($str) { 
    return mb_substr($str, $i, 1); 
}, range(0, mb_strlen($str) -1));
    foreach ($str as $k => $c) {
        if(ctype_upper($c)) {
            $u = true;
            $c = strtolower($c);
        } else {
            $u = false;
        }
       // print_r($c);
        if(in_array($c, $special)) {
            $c = $ascii[array_search($c, $special)];
        }
        if($u) {
            $c = strtoupper($c);
        }
        $str[$k] = $c;
    }
    return join($str);
}
var_dump(make_ascii('áé'));

DEMO

如果问题是大写字母,则必须将功能更改为mb_strtouppermb_strtolower。另外ctype_upper也无效,所以也改变它

function make_ascii($str) {
    //return $str;
    $special = array('ľ','š','č','ť','ž','ý','á','í','é','ú','ä','ô','ň','ě');
    $ascii =   array('l','s','c','t','z','y','a','i','e','u','a','o','n','e');
    $str = array_map(function ($i) use ($str) { 
    return mb_substr($str, $i, 1); 
}, range(0, mb_strlen($str) -1));

    foreach ($str as $k => $c) {
        if( mb_strtoupper($c, "UTF-8") == $c) {
            $u = true;
            $c = mb_strtolower($c);
        } else {
            $u = false;
        }
       // print_r($c);
        if(in_array($c, $special)) {
            $c = $ascii[array_search($c, $special)];
        }
        if($u) {
            $c = mb_strtoupper($c);
        }
        $str[$k] = $c;
    }
    return join($str);
}
$str = "ľÁľa ýellow";
var_dump(make_ascii($str));

DEMO

答案 1 :(得分:0)

正如我所提到的,str_split无法处理多字节字符串。不相信我? Have a look.

无论如何,这是一个可以拆分多字节字符串的版本:

function make_ascii($str) {

    $special = array('ľ','š','č','ť','ž','ý','á','í','é','ú','ä','ô','ň','ě');
    $ascii =   array('l','s','c','t','z','y','a','i','e','u','a','o','n','e');
    $str = preg_split("//u",$str);
    foreach ($str as $k => $c) {
        if(ctype_upper($c)) {
            $u = true;
            $c = mb_strtolower($c);
        } else {
            $u = false;
        }
        if(in_array($c, $special, false)) {
            $c = $ascii[array_search($c, $special)];
        }
        if($u) {
            $c = mb_strtoupper($c);
        }
        $str[$k] = $c;
    }
    return join($str);
}

$str = "ľaľa ýellow";

print_r(make_ascii($str));

Prints:

  拉拉黄色

相关问题