PHP fonksiyon kaldırma aksan ve diğer karakterler ile sorun

6 Cevap php

Ben bir dize bazı istenmeyen karakterleri kaldırmak için basit bir işlevi bulundu.

function strClean($input){

$input = strtolower($input);
$b = array("á","é","í","ó","ú", "ñ", " "); //etc...
$c = array("a","e","i","o","u","n", "-"); //etc...

$input = str_replace($b, $c, $input);

return $input;
}

When I use it on accents or other characters, like this word 'á é ñ í' it prints out those question marks or weird characters, like: output

Not: UTF-8, hem strclean.php (bu işlevi içeren) ve index.php kullanıyorum. aşağıdaki gibi index.php görünüyor:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title></title>
</head>
<body>
    <?php
    include('strclean.php');

    echo 'óóóáà';
    echo strClean('óóóáà');


    ?>
</body>
</html>

Ben yanlış ne yapıyorum?

6 Cevap

Ben kodunuzu test ettik ve hata strtolower fonksiyonda ...

Feryat gibi, mb_strtolower ile değiştirin

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>

<?php
    function strClean($input) {
    	$input = mb_strtolower($input, 'UTF-8');
    	$b = array("á","é","í","ó","ú", "n", " ");
    	$c = array("a","e","i","o","u","n", "-");
    	return str_replace($b, $c, $input);
    }

    $string = 'á é í ó ú n abcdef ghij';
    echo $string ."<br />". strClean($string);
?>

</body>
</html>

Kullanım

iconv('UTF-8', 'ASCII//TRANSLIT', $input);

Sen iconv denemek isteyebilirsiniz.

Eğer önceden $ giriş yazdırırken bir yedek hiç olur mu, yani aynı garip karakterler alabilirim? Eğer öyleyse, PHP kaynak kodu dosyası ve giriş karakter setleri eşleşmiyor ve değiştirmeden önce girişine () iconv kullanmak gerekebilir.

edit: Ben, senin her iki dosya aldı benim webserver onları yüklenen ve baskı ve temizlik (http://www.tag-am-meer.com/test1/ bakınız) çalışıyor. Bu PHP 4.4.9 ve Firefox 3.0.6 üzerinde. Aklıma gelen daha fazla potansiyel problemler:

  • Firefox sizin için çalışır mı? Ben IE6 (ve muhtemelen sonraki sürümleri de) HTML baş bölümünde charset küçük harflerle yazılı olmasını bekliyoruz ki hayal meyal hatırlıyorum ("utf-8")
  • Lütfen editörü kod dosyaları bayt sırası işareti (BOM) dahil mi? Mine, belki PHP bu bobinleri değildir.
  • Eğer devam alışılmadık bir şey kötü bir MIME türü gibi, olmadığını görmek için HTTP başlıklarını bakabilir miyim? Tamper Data add-on Firefox bu konuda yardımcı olabilir için.

Neden aksan kaldırmak istiyorsun? Bu sadece onları görmezden istiyorum mümkün mü? Eğer öyleyse, this answer bunu nasıl gösteren bir Perl çözümü vardır. Perl bir yabancı dilde olduğunu unutmayın. :)

Daha önce bu sorun ile kendimi buldum ve charset sistem kullanımları (benim durumumda ISO-8859 bilmek zorunda çünkü, ben bu yazının yol ve ben yolda bulunan diğerleri takip etmeye çalıştı ve basit bir çözüm yoktu -1) ve bu ben ne yaptım:

    function quit_accenture($str){
      $pattern = array();
      $pattern[0] = '/[Á|Â|À|Å|Ä]/';
      $pattern[1] = '/[É|Ê|È]/';
      $pattern[2] = '/[Í|Î|Ì|Ï]/';
      $pattern[3] = '/[Ó|Ô|Ò|Ö]/';
      $pattern[4] = '/[Ú|Û|Ù|Ü]/';
      $pattern[5] = '/[á|â|à|å|ä]/';
      $pattern[6] = '/[ð|é|ê|è|ë]/';
      $pattern[7] = '/[í|î|ì|ï]/';
      $pattern[8] = '/[ó|ô|ò|ø|õ|ö]/';
      $pattern[9] = '/[ú|û|ù|ü]/';
      $replacement = array();
      $replacement[0] = 'A';
      $replacement[1] = 'E';
      $replacement[2] = 'I';
      $replacement[3] = 'O';
      $replacement[4] = 'U';
      $replacement[5] = 'a';
      $replacement[6] = 'e';
      $replacement[7] = 'i';
      $replacement[8] = 'o';
      $replacement[9] = 'u';
      return preg_replace($pattern, $replacement, $str);
    }
    $txt = $_POST['your_htmled_text'];
    //Convert to your system's charset. I checked this on the php.ini
    $txt = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $txt);
    //Apply your function
    $txt = quit_accenture($txt);
    //output
    print_r($txt);

Bu benim için çalıştı, ama ben de doğru yol olduğunu düşünüyorum :)