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)
没有马赫,即使我复制粘贴从源到数组。此外,我正在寻找方法让这个角色更换工作。
答案 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('áé'));
如果问题是大写字母,则必须将功能更改为mb_strtoupper
和mb_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));
答案 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));
拉拉黄色