为什么不能将全角字符中的所有字符更改为半角字符?

it_*_*ure 9 php

我想将全角字符中的所有字符更改为半角字符,编写以下代码来完成工作.例如,要更改中的所有全角字符

 ???????.?? ? ???????? 
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)

Dra*_*kes 8

一行代码:

$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


Mic*_*has 0

方法二:

\n\n

我已更改preg_replacepreg_replace_callback并使用匿名函数来消除警告。你的正则表达式错了,我已经改了。匿名函数中有简单的查找。

\n\n
<?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);\n
Run Code Online (Sandbox Code Playgroud)\n