我想将全角字符中的所有字符更改为半角字符,编写以下代码来完成工作.例如,要更改中的所有全角字符
???????.?? ? ????????
Run Code Online (Sandbox Code Playgroud)
成半角字符,成
codebit.cn - ????????
Run Code Online (Sandbox Code Playgroud)
有两种方法可以实现目标,但所有这些方法都失败了.
所有的php文件都保存为utf-8格式.
方法1:
<?php
function fulltohalf($str){
$arr=Array(
'?' => '0', '?' => '1', '?' => '2', '?' => '3', '?' => '4',
'?' => '5', '?' => '6', '?' => '7', '?' => '8', '?' => '9',
'?' => 'A', '?' => 'B', '?' => 'C', '?' => 'D', '?' => 'E',
'?' => 'F', '?' => 'G', '?' => 'H', '?' => 'I', '?' => 'J',
'?' => 'K', '?' => 'L', '?' => 'M', '?' => 'N', '?' => 'O',
'?' => 'P', '?' => 'Q', '?' => 'R', '?' => 'S', '?' => 'T',
'?' => 'U', '?' => 'V', '?' => 'W', '?' => 'X', '?' => 'Y',
'?' => 'Z', '?' => 'a', '?' => 'b', '?' => 'c', '?' => 'd',
'?' => 'e', '?' => 'f', '?' => 'g', '?' => 'h', '?' => 'i',
'?' => 'j', '?' => 'k', '?' => 'l', '?' => 'm', '?' => 'n',
'?' => 'o', '?' => 'p', '?' => 'q', '?' => 'r', '?' => 's',
'?' => 't', '?' => 'u', '?' => 'v', '?' => 'w', '?' => 'x',
'?' => 'y', '?' => 'z', '?' => '-'
);
$new = '';
foreach ($str as $char){
if (isset ($arr[$char]))
$new .= $arr[$char];
else
$new .= $arr;
}
return $new;
}
$str="???????.?? ? ????????";
echo fulltohalf($str);
?>
Run Code Online (Sandbox Code Playgroud)
错误信息:

方法2:
<?php
function fulltohalf($Str) {
$Queue = Array(
'?' => '0', '?' => '1', '?' => '2', '?' => '3', '?' => '4',
'?' => '5', '?' => '6', '?' => '7', '?' => '8', '?' => '9',
'?' => 'A', '?' => 'B', '?' => 'C', '?' => 'D', '?' => 'E',
'?' => 'F', '?' => 'G', '?' => 'H', '?' => 'I', '?' => 'J',
'?' => 'K', '?' => 'L', '?' => 'M', '?' => 'N', '?' => 'O',
'?' => 'P', '?' => 'Q', '?' => 'R', '?' => 'S', '?' => 'T',
'?' => 'U', '?' => 'V', '?' => 'W', '?' => 'X', '?' => 'Y',
'?' => 'Z', '?' => 'a', '?' => 'b', '?' => 'c', '?' => 'd',
'?' => 'e', '?' => 'f', '?' => 'g', '?' => 'h', '?' => 'i',
'?' => 'j', '?' => 'k', '?' => 'l', '?' => 'm', '?' => 'n',
'?' => 'o', '?' => 'p', '?' => 'q', '?' => 'r', '?' => 's',
'?' => 't', '?' => 'u', '?' => 'v', '?' => 'w', '?' => 'x',
'?' => 'y', '?' => 'z', '?' => '-'
);
return preg_replace("/([\xA3][\xB0-\xB9\xC1-\xDA\xE1-\xFA])/e","\$Queue[\\1]", $Str);
Run Code Online (Sandbox Code Playgroud)
}
$str = "???????.?? ? ????????";
echo $str;
echo "<br />";
echo fulltohalf($str);
?>
Run Code Online (Sandbox Code Playgroud)
错误信息:

如何修复其中两个?
我解决了方法1的问题,固定代码如下.
<?php
function fulltohalf($str){
$arr=Array(
'?' => '0', '?' => '1', '?' => '2', '?' => '3', '?' => '4',
'?' => '5', '?' => '6', '?' => '7', '?' => '8', '?' => '9',
'?' => 'A', '?' => 'B', '?' => 'C', '?' => 'D', '?' => 'E',
'?' => 'F', '?' => 'G', '?' => 'H', '?' => 'I', '?' => 'J',
'?' => 'K', '?' => 'L', '?' => 'M', '?' => 'N', '?' => 'O',
'?' => 'P', '?' => 'Q', '?' => 'R', '?' => 'S', '?' => 'T',
'?' => 'U', '?' => 'V', '?' => 'W', '?' => 'X', '?' => 'Y',
'?' => 'Z', '?' => 'a', '?' => 'b', '?' => 'c', '?' => 'd',
'?' => 'e', '?' => 'f', '?' => 'g', '?' => 'h', '?' => 'i',
'?' => 'j', '?' => 'k', '?' => 'l', '?' => 'm', '?' => 'n',
'?' => 'o', '?' => 'p', '?' => 'q', '?' => 'r', '?' => 's',
'?' => 't', '?' => 'u', '?' => 'v', '?' => 'w', '?' => 'x',
'?' => 'y', '?' => 'z', '?' => '-'
);
$new = '';
preg_match_all('/./u', $str, $results);
$str=$results[0];
foreach ($str as $char){
if (isset ($arr[$char]))
$new .= $arr[$char];
else
$new .= $char;
}
return $new;
}
echo fulltohalf("???????.?? ? ????????");
?>
Run Code Online (Sandbox Code Playgroud)
一行代码:
$str="???????.?? ? ????????";
$str = mb_convert_kana($str, "rnaskhc", 'UTF-8');
echo $str;
Run Code Online (Sandbox Code Playgroud)
和
???????.?? ? ????????
Run Code Online (Sandbox Code Playgroud)
变
Codebit.cn - ????????
Run Code Online (Sandbox Code Playgroud)
并且你可以保持字母作为奖金的情况下.
参考:http://php.net/mb_convert_kana
方法二:
\n\n我已更改preg_replace为preg_replace_callback并使用匿名函数来消除警告。你的正则表达式错了,我已经改了。匿名函数中有简单的查找。
<?php\nfunction fulltohalf($Str) { \n $Queue = Array( \n \'\xef\xbc\x90\' => \'0\', \'\xef\xbc\x91\' => \'1\', \'\xef\xbc\x92\' => \'2\', \'\xef\xbc\x93\' => \'3\', \'\xef\xbc\x94\' => \'4\', \n \'\xef\xbc\x95\' => \'5\', \'\xef\xbc\x96\' => \'6\', \'\xef\xbc\x97\' => \'7\', \'\xef\xbc\x98\' => \'8\', \'\xef\xbc\x99\' => \'9\', \n \'\xef\xbc\xa1\' => \'A\', \'\xef\xbc\xa2\' => \'B\', \'\xef\xbc\xa3\' => \'C\', \'\xef\xbc\xa4\' => \'D\', \'\xef\xbc\xa5\' => \'E\', \n \'\xef\xbc\xa6\' => \'F\', \'\xef\xbc\xa7\' => \'G\', \'\xef\xbc\xa8\' => \'H\', \'\xef\xbc\xa9\' => \'I\', \'\xef\xbc\xaa\' => \'J\', \n \'\xef\xbc\xab\' => \'K\', \'\xef\xbc\xac\' => \'L\', \'\xef\xbc\xad\' => \'M\', \'\xef\xbc\xae\' => \'N\', \'\xef\xbc\xaf\' => \'O\', \n \'\xef\xbc\xb0\' => \'P\', \'\xef\xbc\xb1\' => \'Q\', \'\xef\xbc\xb2\' => \'R\', \'\xef\xbc\xb3\' => \'S\', \'\xef\xbc\xb4\' => \'T\', \n \'\xef\xbc\xb5\' => \'U\', \'\xef\xbc\xb6\' => \'V\', \'\xef\xbc\xb7\' => \'W\', \'\xef\xbc\xb8\' => \'X\', \'\xef\xbc\xb9\' => \'Y\', \n \'\xef\xbc\xba\' => \'Z\', \'\xef\xbd\x81\' => \'a\', \'\xef\xbd\x82\' => \'b\', \'\xef\xbd\x83\' => \'c\', \'\xef\xbd\x84\' => \'d\', \n \'\xef\xbd\x85\' => \'e\', \'\xef\xbd\x86\' => \'f\', \'\xef\xbd\x87\' => \'g\', \'\xef\xbd\x88\' => \'h\', \'\xef\xbd\x89\' => \'i\', \n \'\xef\xbd\x8a\' => \'j\', \'\xef\xbd\x8b\' => \'k\', \'\xef\xbd\x8c\' => \'l\', \'\xef\xbd\x8d\' => \'m\', \'\xef\xbd\x8e\' => \'n\', \n \'\xef\xbd\x8f\' => \'o\', \'\xef\xbd\x90\' => \'p\', \'\xef\xbd\x91\' => \'q\', \'\xef\xbd\x92\' => \'r\', \'\xef\xbd\x93\' => \'s\', \n \'\xef\xbd\x94\' => \'t\', \'\xef\xbd\x95\' => \'u\', \'\xef\xbd\x96\' => \'v\', \'\xef\xbd\x97\' => \'w\', \'\xef\xbd\x98\' => \'x\', \n \'\xef\xbd\x99\' => \'y\', \'\xef\xbd\x9a\' => \'z\', \'\xef\xbc\x8d\' => \'-\' \n ); \n\n return preg_replace_callback(\n "/([\\xEF][\\x80-\\xBF]+)/",\n function($m) use($Queue) {\n if (array_key_exists($m[0], $Queue)) {\n return $Queue[$m[0]];\n } else {\n return $m[0];\n }\n },\n $Str);\n}\n\n$str = "\xef\xbc\xa3\xef\xbd\x8f\xef\xbd\x84\xef\xbd\x85\xef\xbd\x82\xef\xbd\x89\xef\xbd\x94.\xef\xbd\x83\xef\xbd\x8e \xef\xbc\x8d \xe8\x81\x9a\xe5\x90\x88\xe5\xb0\x8f\xe6\xae\xb5\xe7\xb2\xbe\xe5\x8d\x8e\xe4\xbb\xa3\xe7\xa0\x81"; \necho $str; \necho "<br />"; \necho fulltohalf($str);\nRun Code Online (Sandbox Code Playgroud)\n