Проблема с функцией удаления акцентов и других символов в PHP - PullRequest
1 голос
/ 03 марта 2009

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

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

Когда я использую его на ударениях или других символах, например, это слово 'á é - í', оно выводит эти знаки вопроса или странные символы, например вывод 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>

Что я делаю не так?

Ответы [ 6 ]

5 голосов
/ 03 марта 2009

Используйте

iconv('UTF-8', 'ASCII//TRANSLIT', $input);
4 голосов
/ 03 марта 2009

Вы можете попробовать iconv .

3 голосов
/ 03 марта 2009

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

edit: Я взял оба ваших файла, загрузил их на свой веб-сервер, и печать и очистка работают нормально (см. 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 для Firefox.
2 голосов
/ 03 марта 2009

Я проверил ваш код, и ошибка в функции 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>
0 голосов
/ 09 апреля 2014

Раньше я сталкивался с этой проблемой, и я пытался следовать указаниям этого поста и других, которые я нашел в пути, и не было простого решения, потому что вы должны знать кодировку, которую использует ваша система (в моем случае 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);

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

0 голосов
/ 05 марта 2011

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

...