在PHP中删除重音符号和其他字符的函数出现问题

在PHP中删除重音符号和其他字符的函数出现问题,php,string,unicode,utf-8,Php,String,Unicode,Utf 8,我找到了一个简单的函数,可以从字符串中删除一些不需要的字符 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; } 当我

我找到了一个简单的函数,可以从字符串中删除一些不需要的字符

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;
}
当我在口音或其他字符上使用它时,比如这个单词“áéñí”,它会打印出那些问号或奇怪的字符,比如:

注意:我正在UTF-8中使用strclean.php(包含此函数)和index.php。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>


我做错了什么?

是否会发生替换,即当您事先打印$input时是否会得到相同的奇怪字符?如果是这样,PHP源代码文件的字符集与输入不匹配,在替换之前,可能需要对输入使用iconv()

编辑:我将您的两个文件都上传到我的Web服务器,打印和清理工作正常(请参阅)。这是在PHP4.4.9和Firefox3.0.6上实现的。我想到了更多的潜在问题:

  • 它在Firefox上适用吗?我隐约记得IE6(可能还有更高版本)希望HTML头部分中的字符集是用小写(“utf-8”)编写的
  • 编辑器是否在代码文件中包含字节顺序标记(BOM)?我的没有,也许PHP会被这些东西噎住
  • 您可以查看HTTP头以查看是否有异常情况发生,例如错误的MIME类型吗?Firefox的篡改数据插件可以帮助实现这一点

是否会发生替换,即当您事先打印$input时是否会得到相同的奇怪字符?如果是这样,PHP源代码文件的字符集与输入不匹配,在替换之前,可能需要对输入使用iconv()

编辑:我将您的两个文件都上传到我的Web服务器,打印和清理工作正常(请参阅)。这是在PHP4.4.9和Firefox3.0.6上实现的。我想到了更多的潜在问题:

  • 它在Firefox上适用吗?我隐约记得IE6(可能还有更高版本)希望HTML头部分中的字符集是用小写(“utf-8”)编写的
  • 编辑器是否在代码文件中包含字节顺序标记(BOM)?我的没有,也许PHP会被这些东西噎住
  • 您可以查看HTTP头以查看是否有异常情况发生,例如错误的MIME类型吗?Firefox的篡改数据插件可以帮助实现这一点
    • 您可能想试试

      您可能想试试

      使用

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


      我已经测试了你的代码,错误在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>
      

      我已经测试了您的代码,错误在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>
      
      
      
      为什么要删除重音符号?有没有可能你只是想忽略它们?如果是这样,我们有一个Perl解决方案来演示如何做到这一点。请注意,Perl是用外语编写的。:)

      为什么要删除重音符号?有没有可能你只是想忽略它们?如果是这样,我们有一个Perl解决方案来演示如何做到这一点。请注意,Perl是用外语编写的。:)

      我以前发现自己遇到了这个问题,我试图跟随这篇文章和我在途中发现的其他文章的线索,但没有简单的解决方案,因为你必须知道你的系统使用的字符集(在我的例子中是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);
      

      这对我来说很有效,但我也认为这是正确的方法:)

      我以前发现自己遇到了这个问题,我试图跟随这篇文章和我在途中发现的其他文章的线索,但没有简单的解决方案,因为你必须知道你的系统使用的字符集(在我的例子中是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);
      

      这对我来说很有效,但我也认为是正确的方式:)

      是的,空格会被替换,还有其他我没有包含的字符,比如“.”我所有的文件都是utf-8格式的,如果我打印的是我正确看到的,这就是为什么我觉得这很奇怪……是的,空格会被替换,以及其他我没有包括的字符,比如“.”。我所有的文件都是utf-8格式的,如果我打印了ááááá,我看对了,这就是为什么我觉得这很奇怪……你的例子对我很有用,所以你一定在某个地方有编码问题……好的,谢谢。至少我知道我做对了。然而,这并不能缓解我的头痛:我已经有一段时间的编码问题了。在这之前,请停止屠杀我们的语言。德语中正确替换ä的是ae,而不是a。读一下音译!你在用Firebug吗?您能看到HTTP头中声明了预期的编码吗?在任何输出之前,在第一行中写入“”。您的示例对我很有用,因此您一定在某个地方遇到了一些编码问题…好的,谢谢。至少我知道我做对了。然而,这并不能缓解我的头痛:我已经有一段时间的编码问题了。在这之前,请停止屠杀我们的语言。德语中正确地替代ä是ae,而不是a。读一下音译!你在用Firebug吗?您能看到HTTP头中声明了预期的编码吗?在任何输出之前的第一行中写入“”。这是一种很好的方法。许多(口语)语言使用各种口音,也使用多种口音(如inê+`=ề). 如果替换表不是详尽无遗的话,这将不适用。这是一个很好的方法。许多(口语)语言使用不同的重音,也使用多种重音(如inê+`=ề). 如果不是详尽无遗的话,这将不适用于替换表。