56

フォーム (form.php ドキュメント) から MySQL ベースにコンテンツを保存する php ドキュメント signup.php があります。入力コンテンツを再フォーマットしたいときに問題が発生します。à->a のような UTF-8 文字をデコードしたい。

  $first_name=$_POST['first_name'];
  $last_name=$_POST['last_name'];
  $course=$_POST['course'];

  $chain="prêt-à-porter";

$pattern = array("'é'", "'è'", "'ë'", "'ê'", "'É'", "'È'", "'Ë'", "'Ê'", "'á'", "'à'", "'ä'", "'â'", "'å'", "'Á'", "'À'", "'Ä'", "'Â'", "'Å'", "'ó'", "'ò'", "'ö'", "'ô'", "'Ó'", "'Ò'", "'Ö'", "'Ô'", "'í'", "'ì'", "'ï'", "'î'", "'Í'", "'Ì'", "'Ï'", "'Î'", "'ú'", "'ù'", "'ü'", "'û'", "'Ú'", "'Ù'", "'Ü'", "'Û'", "'ý'", "'ÿ'", "'Ý'", "'ø'", "'Ø'", "'œ'", "'Œ'", "'Æ'", "'ç'", "'Ç'");

$replace = array('e', 'e', 'e', 'e', 'E', 'E', 'E', 'E', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A', 'A', 'o', 'o', 'o', 'o', 'O', 'O', 'O', 'O', 'i', 'i', 'i', 'I', 'I', 'I', 'I', 'I', 'u', 'u', 'u', 'u', 'U', 'U', 'U', 'U', 'y', 'y', 'Y', 'o', 'O', 'a', 'A', 'A', 'c', 'C'); 

$chain = preg_replace($pattern, $replace, $chain);

echo $chain; // print pret-a-porter

$first_name =  preg_replace($pattern, $replace, $first_name);

echo $first_name; // does not change the input!?!

$chain では完全に機能するのに、$first_name または $last_name では機能しないのはなぜですか?

また、私は試します

echo $first_name; // print áááááábéééééébšššš
$trans = array("á" => "a", "é" => "e", "š" => "s");
echo strtr("áááááábéééééébšššš", $trans); // print aaaaaabeeeeeebssss
echo strtr($first_name,$trans);  // print áááááábéééééébšššš

しかし、ご覧のとおり、問題は同じです。

4

8 に答える 8

97

これを行うには、はるかに簡単な方法がありiconvます。ユーザー ノートによると、これはあなたがやりたいことのようです:文字の音訳

// PHP.net User notes
<?php
    $string = "ʿABBĀSĀBĀD";

    echo iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $string);
    // output: [nothing, and you get a notice]

    echo iconv('UTF-8', 'ISO-8859-1//IGNORE', $string);
    // output: ABBSBD

    echo iconv('UTF-8', 'ISO-8859-1//TRANSLIT//IGNORE', $string);
    // output: ABBASABAD
    // Yay! That's what I wanted!
?>

フロントエンド、フォーム送信、ソースファイルのエンコーディングなど、プロセスのすべての段階で同じエンコーディングを維持できるように、文字エンコーディングには十分注意してください。PHP とフォームのデフォルトのエンコーディングは ISO-8859-1 ですが、PHP 5.4 より前では UTF8 に変更されました (ついに!)。

アイデアを試すことができる関数がいくつかあります。1 つ目は、CakePHP の inflector クラスからのもので、次のように呼ばれslugます。

public static function slug($string, $replacement = '_') {
    $quotedReplacement = preg_quote($replacement, '/');

    $merge = array(
        '/[^\s\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]/mu' => ' ',
        '/\\s+/' => $replacement,
        sprintf('/^[%s]+|[%s]+$/', $quotedReplacement, $quotedReplacement) => '',
    );

    $map = self::$_transliteration + $merge;
    return preg_replace(array_keys($map), array_values($map), $string);
}

質問で行っていたことと同様の配列に依存します- github で inflector のソースを確認self::$_transliterationできます。

もう 1 つは、私が個人的に使用している関数で、ここから来ています

function slugify($text,$strict = false) {
    $text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
    // replace non letter or digits by -
    $text = preg_replace('~[^\\pL\d.]+~u', '-', $text);

    // trim
    $text = trim($text, '-');
    setlocale(LC_CTYPE, 'en_GB.utf8');
    // transliterate
    if (function_exists('iconv')) {
        $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
    }

    // lowercase
    $text = strtolower($text);
    // remove unwanted characters
    $text = preg_replace('~[^-\w.]+~', '', $text);
    if (empty($text)) {
        return 'empty_$';
    }
    if ($strict) {
        $text = str_replace(".", "_", $text);
    }
    return $text;
}

これらの関数が行うことは、任意のテキスト入力から「スラッグ」を音訳して作成することです。これは、Web アプリを作成するときにツールチェストにあると非常に便利です。お役に立てれば!

于 2012-04-14T10:35:05.183 に答える
9

文字列 $chain は、配列内の文字と同じ文字エンコーディングです。$first_name 文字列が異なるエンコーディングである可能性があり、それらの文字が一致しない可能性があります。代わりに、マルチバイト文字列関数を使用してみてください。

mb_convert_encoding を試してください。HTML_ENTITIES を to_encoding パラメーターとして使用することもできます。その場合、文字がどのように変換されるかを心配する必要はありません。非常に予測可能です。

このスクリプトへの入力が UTF-8 であると仮定すると、おそらく開始するのに悪い場所ではありません...

$first_name = mb_convert_encoding($first_name, "HTML-ENTITIES", "UTF-8"); 
于 2012-04-14T10:42:37.303 に答える
7

もっと早くこのスレに出会いたかった。私が作成した関数 (時間がかかりすぎた) は以下のとおりです。

function CheckLetters($field){
    $letters = [
        0 => "a à á â ä æ ã å ā",
        1 => "c ç ć č",
        2 => "e é è ê ë ę ė ē",
        3 => "i ī į í ì ï î",
        4 => "l ł",
        5 => "n ñ ń",
        6 => "o ō ø œ õ ó ò ö ô",
        7 => "s ß ś š",
        8 => "u ū ú ù ü û",
        9 => "w ŵ",
        10 => "y ŷ ÿ",
        11 => "z ź ž ż",
    ];
    foreach ($letters as &$values){
        $newValue = substr($values, 0, 1);
        $values = substr($values, 2, strlen($values));
        $values = explode(" ", $values);
        foreach ($values as &$oldValue){
            while (strpos($field,$oldValue) !== false){
                $field = preg_replace("/" . $oldValue . '/', $newValue, $field, 1);
            }
        }
    }
    return $field;
}
于 2016-01-19T02:37:41.073 に答える
3

CodeIgniter の方法:

$this->load->helper('text');

$string = convert_accented_characters($string);

この関数は、コンパニオン構成ファイルapplication/config/foreign_chars.phpを使用して、文字変換用の to および from 配列を定義します。

https://www.codeigniter.com/user_guide/helpers/text_helper.html#ascii_to_entities

于 2016-11-19T04:57:40.183 に答える