2015-04-09 4 views
8

Ich möchte alle Zeichen von Zeichen mit voller Breite in Zeichen mit halber Breite ändern, schreiben Sie die folgenden Codes, um die Aufgabe zu erledigen. zum Beispiel alle voller Breite Zeichen zu ändern, inWarum können nicht alle Zeichen von Zeichen mit voller Breite in Zeichen mit halber Breite geändert werden?

Codebit.cn - 聚合小段精华代码 

in halber Breite Zeichen, in

codebit.cn - 聚合小段精华代码 

Es gibt zwei Methoden, um das Ziel acheive, aber alle von ihnen versagt.
Alle php-Datei wurden als UTF-8-Format gespeichert.

Methode 1:

<?php 
    function fulltohalf($str){ 
    $arr=Array( 
    '0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', 
    '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', 
    'A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D', 'E' => 'E', 
    'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J', 
    'K' => 'K', 'L' => 'L', 'M' => 'M', 'N' => 'N', 'O' => 'O', 
    'P' => 'P', 'Q' => 'Q', 'R' => 'R', 'S' => 'S', 'T' => 'T', 
    'U' => 'U', 'V' => 'V', 'W' => 'W', 'X' => 'X', 'Y' => 'Y', 
    'Z' => 'Z', 'a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd', 
    'e' => 'e', 'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i', 
    'j' => 'j', 'k' => 'k', 'l' => 'l', 'm' => 'm', 'n' => 'n', 
    'o' => 'o', 'p' => 'p', 'q' => 'q', 'r' => 'r', 's' => 's', 
    't' => 't', 'u' => 'u', 'v' => 'v', 'w' => 'w', 'x' => 'x', 
    'y' => 'y', 'z' => 'z', '-' => '-' 
    ); 

    $new = '';    
    foreach ($str as $char){ 
     if (isset ($arr[$char])) 
      $new .= $arr[$char];  
     else 
      $new .= $arr;  
     } 
    return $new; 
    } 

$str="Codebit.cn - 聚合小段精华代码"; 
echo fulltohalf($str); 
?> 

Fehlermeldung:

enter image description here

Methode 2:

<?php 
function fulltohalf($Str) { 
    $Queue = Array( 
    '0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', 
    '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', 
    'A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D', 'E' => 'E', 
    'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J', 
    'K' => 'K', 'L' => 'L', 'M' => 'M', 'N' => 'N', 'O' => 'O', 
    'P' => 'P', 'Q' => 'Q', 'R' => 'R', 'S' => 'S', 'T' => 'T', 
    'U' => 'U', 'V' => 'V', 'W' => 'W', 'X' => 'X', 'Y' => 'Y', 
    'Z' => 'Z', 'a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd', 
    'e' => 'e', 'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i', 
    'j' => 'j', 'k' => 'k', 'l' => 'l', 'm' => 'm', 'n' => 'n', 
    'o' => 'o', 'p' => 'p', 'q' => 'q', 'r' => 'r', 's' => 's', 
    't' => 't', 'u' => 'u', 'v' => 'v', 'w' => 'w', 'x' => 'x', 
    'y' => 'y', 'z' => 'z', '-' => '-' 
); 

return preg_replace("/([\xA3][\xB0-\xB9\xC1-\xDA\xE1-\xFA])/e","\$Queue[\\1]", $Str); 

}

$str = "Codebit.cn - 聚合小段精华代码"; 
echo $str; 
echo "<br />"; 
echo fulltohalf($str); 
?> 
Nachricht

Fehler:

enter image description here

Wie zwei von ihnen zu beheben?

Ich löste die Methode 1 Problem, die festen Codes sind wie folgt.

+0

Bitte beachten Sie, dass Sie in Methode eins versuchen, über $ str zu iterieren, das kein Array ist. Wie auch immer ** Sie ** über Strings iterieren können, indem Sie eine for-Schleife wie 'für ($ i = 0; $ i Anticom

+0

Mein Gott, warum das benutzerdefinierte Array? Bitte sehen Sie meine einzeilige Antwort. PHP hat eine eingebaute Funktion für diese – Drakes

Antwort

0

Methode 2:

Ich habe preg_replace-preg_replace_callback geändert und verwendet anonyme Funktion die Warnung zum Schweigen zu bringen. Dein regulärer Ausdruck war falsch, ich habe ihn geändert. Es gibt einfache Suche in anonymer Funktion.

<?php 
function fulltohalf($Str) { 
    $Queue = Array( 
     '0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', 
     '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', 
     'A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D', 'E' => 'E', 
     'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J', 
     'K' => 'K', 'L' => 'L', 'M' => 'M', 'N' => 'N', 'O' => 'O', 
     'P' => 'P', 'Q' => 'Q', 'R' => 'R', 'S' => 'S', 'T' => 'T', 
     'U' => 'U', 'V' => 'V', 'W' => 'W', 'X' => 'X', 'Y' => 'Y', 
     'Z' => 'Z', 'a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd', 
     'e' => 'e', 'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i', 
     'j' => 'j', 'k' => 'k', 'l' => 'l', 'm' => 'm', 'n' => 'n', 
     'o' => 'o', 'p' => 'p', 'q' => 'q', 'r' => 'r', 's' => 's', 
     't' => 't', 'u' => 'u', 'v' => 'v', 'w' => 'w', 'x' => 'x', 
     'y' => 'y', 'z' => 'z', '-' => '-' 
    ); 

    return preg_replace_callback(
     "/([\xEF][\x80-\xBF]+)/", 
     function($m) use($Queue) { 
      if (array_key_exists($m[0], $Queue)) { 
       return $Queue[$m[0]]; 
      } else { 
       return $m[0]; 
      } 
     }, 
     $Str); 
} 

$str = "Codebit.cn - 聚合小段精华代码"; 
echo $str; 
echo "<br />"; 
echo fulltohalf($str); 
1

strstr() sucht nach einem Vorkommen einer Zeichenfolge in einer anderen Zeichenfolge.

Sie rufen es mit einer Zeichenfolge und einem Array auf.

Warum geben Sie nicht einfach die entsprechenden Werte für die Schlüssel zurück?

function fulltohalf($str){ 

    $arr = array('0' => '0', '1' => '1', '2' => '2', '3' => '3', 
       '4' => '4','5' => '5', '6' => '6', '7' => '7', 
       '8' => '8', '9' => '9','A' => 'A', 
       .... 
       ); 
    $new = '';   //initialise output 
    $old = str_split($str); // convert string to array of characters 
    foreach ($old as $char){ 
     if (isset $arr[$char]) //check if the input is a key in the array 
      $new .= $arr[$char]; //add to output 
     else 
      $new .= '_'; //put something to indicate missing/undefined 
    } 
    return $new; 
} 

Es könnte ineffizient sein, das Array bei jedem Funktionsaufruf zu erstellen.

Sie könnten es in Ihrer Hauptfunktion definieren und nur an Ihre fulltohelf() Funktion übergeben, oder überhaupt nicht mit einer Funktion belästigen.

Wie immer in diesen Fällen werde ich hinzufügen, dass Sie vermeiden sollten, mysql zugunsten von mysqli (verbessert).

ZUSÄTZLICHE

Wenn von einem Zeichensatz in einen anderen umzuwandeln, ich die PHP-Funktionen verwenden würde, anstatt das Rad neu zu erfinden.

siehe mb_convert_encoding und supported encodings

ich kann nicht sicher sein, welche Kodierungen Sie von/zu gehen, aber so etwas wie die folgenden könnte den Trick tun:

mb_convert_encoding($str, "UTF-8","UCS-2") 
+0

Liebe loopo, wenn die Zeichenfolge mehrere Zeichen enthalten, kann es den Job nicht tun. –

+0

Es tut mir leid, dass ich meine Frage für Klarheit geändert habe. –

1

Eine einfache Lösung wäre mit str_replace() mit Arrays von Strings, effektiv eine Multibyte ersetzen. Zum Beispiel:

$str = 'Fooooo'; 
echo str_replace(array('F', 'o'), array('F', 'o'), $str); 

Eine wahrscheinlich robustere Lösung wäre mb_convert_kana() verwenden, etwa so:

$str = 'Fooooo'; 
echo mb_convert_kana($str, 'a', 'UTF-8'); // change UTF-8 to fit your input charset 

Beide Lösungen folgende Ausgabe:

Fooooo 
1

Statt preg_replace verwenden ich in diesem denken Beispiel ist es besser, str_replace zu verwenden. Wir suchen eine Zeichenfolge nach den Schlüsseln des Warteschlangenarrays und ersetzen sie durch ihre entsprechenden Werte. Dies ist auch eine sehr lesbare und einfache Lösung.

function fulltohalf($str) 
{ 
    $queue = [ 
     '0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', 
     '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', 
     'A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D', 'E' => 'E', 
     'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J', 
     'K' => 'K', 'L' => 'L', 'M' => 'M', 'N' => 'N', 'O' => 'O', 
     'P' => 'P', 'Q' => 'Q', 'R' => 'R', 'S' => 'S', 'T' => 'T', 
     'U' => 'U', 'V' => 'V', 'W' => 'W', 'X' => 'X', 'Y' => 'Y', 
     'Z' => 'Z', 'a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd', 
     'e' => 'e', 'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i', 
     'j' => 'j', 'k' => 'k', 'l' => 'l', 'm' => 'm', 'n' => 'n', 
     'o' => 'o', 'p' => 'p', 'q' => 'q', 'r' => 'r', 's' => 's', 
     't' => 't', 'u' => 'u', 'v' => 'v', 'w' => 'w', 'x' => 'x', 
     'y' => 'y', 'z' => 'z', '-' => '-' 
    ]; 

    return str_replace(array_keys($queue),array_values($queue),$str); 
} 

Bitte beachte, dass ich, indem er erklärt die Seite in UTF-8-Modus hatte:

<meta charset="UTF-8"> 

Hier ist mein Test:

$str = "Codebit.cn - 聚合小段精华代码"; 
echo $str; 
echo "<br>"; 
echo fulltohalf($str); 

Hier meine Ergebnisse sind:

Codebit.cn - 聚合 小段 精华 代码
Codebit.cn - 聚合 小段 精华 代码

7

eine Zeile Code:

$str="Codebit.cn - 聚合小段精华代码"; 
$str = mb_convert_kana($str, "rnaskhc", 'UTF-8'); 
echo $str; 

und

Codebit.cn - 聚合小段精华代码 

wird

Codebit.cn - 聚合小段精华代码 

und Sie können t halten er Fall der Briefe als Bonus.

Ref: http://php.net/mb_convert_kana

0

Ich repariere einfach Ihren Fehler.

<?php 
function fulltohalf($str){ 
    $arr=Array(
     '0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', 
     '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', 
     'A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D', 'E' => 'E', 
     'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J', 
     'K' => 'K', 'L' => 'L', 'M' => 'M', 'N' => 'N', 'O' => 'O', 
     'P' => 'P', 'Q' => 'Q', 'R' => 'R', 'S' => 'S', 'T' => 'T', 
     'U' => 'U', 'V' => 'V', 'W' => 'W', 'X' => 'X', 'Y' => 'Y', 
     'Z' => 'Z', 'a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd', 
     'e' => 'e', 'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i', 
     'j' => 'j', 'k' => 'k', 'l' => 'l', 'm' => 'm', 'n' => 'n', 
     'o' => 'o', 'p' => 'p', 'q' => 'q', 'r' => 'r', 's' => 's', 
     't' => 't', 'u' => 'u', 'v' => 'v', 'w' => 'w', 'x' => 'x', 
     'y' => 'y', 'z' => 'z', '-' => '-' 
    ); 

    $new = ''; 
    for($i = 0; $i < strlen($str); $i++){ 
     $char = $str[$i]; 
     $new .= (isset($arr[$char]))? $arr[$char]: $char; 
    } 
    return $new; 
} 

$str="Codebit.cn - 聚合小段精华代码"; 
echo fulltohalf($str); 
?> 

Zuerst Code verwendet foreach und ich geändert for ($ i = ...), weil String nicht foreach-Syntax (iteriert) wird unterstützt. Zweitens ist Ihre if/else-Phrase inkompatibel mit Logik.

if()$arr[$char]; else $arr; // <- else array!? 

und ich festgelegt, dass,

if() $converted_char; else $original_char; 

Auch Sie eine andere Methode

jeder sagt, verwenden können, mb_convert_kana(). Ja, das ist eine großartige Lösung.

Verwandte Themen