2009-03-03 2 views
1

Я нашел простую функцию для удаления некоторых нежелательных символов из строки.Проблема с функцией удаления акцентов и других символов в PHP

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; 
} 

Когда я использую его на акцентов или других персонажей, как это слово «á é ñ í» она печатает эти знаки вопроса или странные символы, такие как: output http://img217.imageshack.us/img217/6794/59472278.jpg

Примечание: Я использую strclean.php (который содержит эту функцию) и index.php, как в UTF-8. index.php выглядит следующим образом:

<!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> 

Что я делаю неправильно?

+0

Ваш пример работает со мной, так что вы должны есть некоторые проблемы с кодированием где-то ... –

+0

Хорошо, спасибо. По крайней мере, я знаю, что делаю все правильно.Тем не менее, это не облегчает мою головную боль: S У меня проблемы с кодировкой на некоторое время. Раньше это было в phpmyadmin. – Nacho

+0

, пожалуйста, прекратите разделять наши языки. правильная замена ä на немецком языке является ae, а не a. читать транслитерацию! – hop

ответ

2

Я проверил ваш код, и ошибка в функции strtolower ...

Замените его mb_strtolower, как сильфона

<!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> 
3

Выполняется ли замена вообще, то есть вы получаете одни и те же странные символы, когда вы печатаете $ input заранее? Если это так, наборы символов вашего исходного кода PHP и ввода не совпадают, и вам, возможно, потребуется использовать iconv() на входе перед заменой.

Редактировать: Я взял оба ваших файла, загрузил их на свой веб-сервер и выполнил печать и очистку (см. http://www.tag-am-meer.com/test1/). Это на PHP 4.4.9 и Firefox 3.0.6. Больше потенциальных проблем, которые приходят мне на ум:

  • Работает ли он на вас в Firefox? Я смутно помню, что IE6 (и, вероятно, более поздние версии) ожидают, что кодировка в разделе заголовка HTML будет записана в нижнем регистре («utf-8»)
  • Включает ли ваш редактор байты байтов (BOM) в файлы кода ? Моя не делает, может быть, PHP задыхается от этих проблем.
  • Можете ли вы посмотреть заголовки HTTP, чтобы увидеть, происходит ли что-то необычное, например, плохой тип MIME? Это может помочь дополнение Tamper Data.
+0

Да, пробелы заменяются, а также другие символы, которые я не включил, например «.». Все мои файлы находятся в utf-8, и если я напечатаю «Я», я вижу это правильно, поэтому я думаю, что это странно ... – Nacho

4

Возможно, вы захотите попробовать iconv.

5

Использование

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

Это хороший способ сделать это. Многие (разговорные) языки используют различные акценты, а также множественные акценты (например, в ê + '= ề). Это не будет работать с таблицей замены, если она не является исчерпывающей. – Yvan

0

Почему вы хотите удалить акценты? Возможно ли, что вы просто хотите их игнорировать? Если да, this answer имеет решение Perl, которое демонстрирует, как это сделать. Обратите внимание, что Perl находится на иностранном языке. :)

0

Я столкнулся с этой проблемой раньше, и я попытался следить за выводами этого сообщения и другими, которые я нашел по дороге, и не было простого решения, потому что вам нужно знать кодировку, используемую вашей системой (в моем случае ISO-8859-1), и это то, что я сделал:

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); 

Это работает для меня, но я также думаю, что это правильный путь :)

Смежные вопросы