strtr()部分无效

时间:2016-08-19 10:12:59

标签: php strtr

我构建了一个应该为我的项目生成站点地图的脚本。

此脚本使用strtr()替换不需要的符号,并转换德语变音符号。

    $ers = array( '<' => '', '>' => '', ' ' => '-',  'Ä' => 'Ae', 'Ö' => 'Oe', 'Ü' => 'Ue', 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß' => 'ss', '&' => 'und', '*' => '', ' - ' => '-', ',' => '', '.' => '', '!' => '', '?' => '' );
foreach ($rs_post as $row) { 
  $kategorie = $row['category'];
  $kategorie = strtr($kategorie,$ers);
  $kategorie = strtolower($kategorie);
  $kategorie = trim($kategorie);
  $org_file .= "<url><loc>https://domain.org/kategorie/" . $kategorie . "/</loc><lastmod>2016-08-18T19:02:42+00:00</lastmod><changefreq>monthly</changefreq><priority>0.2</priority></url>" . PHP_EOL;
}

像“&lt;”这样的不需要的标志将被正确替换,但德国的变音符号不会被转换。我不明白为什么。

有人对我有点意见吗?

的Torsten

2 个答案:

答案 0 :(得分:0)

检查charset。 如果您的发送表单页面使用:

<meta charset="utf-8"> 

不起作用。

尝试使用其他编码,例如

<meta charset="ISO-8859-1">

这是一个用于测试替换阵列的小样本代码:

<!DOCTYPE html>
<html>
<?php
if(isset($_POST["txt"])) 
{   
    echo '<head><meta charset="ISO-8859-1"></head><body>';

    $posted = $_POST["txt"]; 
    echo 'Received raw: ' . $posted .'<br/>';
    echo 'Received: ' . htmlspecialchars($posted).'<br/>';; 

    $ers = array( '<' => '', '>' => '', ' ' => '-',  'Ä' => 'Ae', 'Ö' => 'Oe', 'Ü' => 'Ue', 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß' => 'ss', '&' => 'und', '*' => '', ' - ' => '-', ',' => '', '.' => '', '!' => '', '?' => '' );

    $replaced = strtr($posted,$ers);   
    echo 'Replaced: ' . $replaced .'<br/>';  
}
else {
    ?>  
<head>
    <!--<meta charset="utf-8">--> <!--THIS ENCODING WILL NOT WORK -->
     <meta charset="ISO-8859-1">  <!--THIS WORKS FINE -->
</head>
<body> 
  <p>the text you want to replace here</p>
  <form action="#" method="post">
  Text: <input type="text" name="txt" value="">
  <input type="submit" value="Submit">
</form>

<?php   
}
?>  
</body>
</html>

答案 1 :(得分:0)

正如其他人所说,最可能的原因是字符编码不匹配。由于您尝试转换的标题显然是UTF-8,因此问题很可能是您的PHP源代码不是。尝试将文件重新保存为UTF-8文本,并查看是否可以解决问题。

BTW,一种简单的调试方法是使用例如打印输出文件将数据行和音译阵列打印到同一输出文件中。 print_r()var_dump(),查看输出以查看其中的非ASCII字符是否正确。如果字符在数据中看起来正确但在音译表中是错误的(反之亦然),则表明编码不匹配。

聚苯乙烯。如果您安装了PHP iconv扩展程序(并且可能已安装),请考虑using it to automatically convert your titles to ASCII.