【问题标题】:Replace Turkish letters with English letters用英文字母替换土耳其字母
【发布时间】:2013-11-04 03:19:03
【问题描述】:

我想用英文字母替换句子中的每个土耳其字母,我尝试以下功能:

$title_result = "Türkiye'nin en iyi oranlari ile Lider Bahis Sitesi";
$turkish = array("ı", "ğ", "ü", "ş", "ö", "ç");//turkish letters
$english   = array("i", "g", "u", "s", "o", "c");//english cooridinators letters

$final_title = str_replace($turkish, $english, $title_result);//replace php function
print_r($turkish);//when printing this i got: Array ( [0] => ı [1] => ğ [2] => ü [3] => ş [4] => ö [5] => ç ) 
return $final_title;

我认为土耳其字符的问题,但我不知道如何使 php 正确读取此字符以正确替换。我需要你的建议吗??

【问题讨论】:

  • 您的代码在我的机器上运行良好。也许您的配置有问题 - 检查 mbstring:php.net/manual/en/book.mbstring.php
  • 最终的标题没有显示或打印,因为 str_replace 不起作用所以它没有价值
  • 请查看 mbstring 的 php 信息(Linux 终端中的php -i | grep mbstring)。它应该被启用,因为我猜土耳其字符可以存储在两个字节而不是一个字节中
  • 为什么要这样替换?如果您认为不能使用土耳其语字母,那您可能错了。如果它们真的无法使用,通常最好避免丢失太多信息并替换例如“ş”由“sh”而不是“s”。
  • phpfiddle 上运行良好

标签: php html regex


【解决方案1】:

您是否注意到您打印的是$turkish 而不是替换的字符串(即$final_title)?您会看到一个数组,因为您正在打印该数组。如果您在浏览器上单独打印数组,您会看到那些乱七八糟的字符,可能是因为输出不是 UTF-8 编码的。但是,如果您这样做(注意元标记):

<meta charset="utf-8" />
<?php
$title_result = "Türkiye'nin en iyi oranlari ile Lider Bahis Sitesi";
$turkish = array("ı", "ğ", "ü", "ş", "ö", "ç");//turkish letters
$english   = array("i", "g", "u", "s", "o", "c");//english cooridinators letters

$final_title = str_replace($turkish, $english, $title_result);//replace php function
print_r($turkish);

您将正确地看到字符。但这不是问题。 str_replace() 工作正常。它应该可以正常工作。

【讨论】:

  • 我在头文件中使用 latin-1 作为字符集,因为 utf8 无法在我的浏览器中打印出土耳其语字符。我的问题是 str_replace 不做替换,旧字符串和新字符串是一样的
  • 但是在$title_result 中没有土耳其字符!所以str_replace与这个字符串无关。
  • 这段代码所在文件的字符编码是什么?尝试将其更改为不带 BOM 的 UTF-8 或 UTF-8。它有效吗? (不过要小心,因为这会弄乱你的文件,所以在做任何事情之前先备份。我在 Notepad++ 上执行 Ctrl+A、Ctrl+X、更改编码、Ctrl+V)。编码是我还没有掌握的技巧。
  • @k102 第二个字符是 ü... 这是唯一的字符。大声笑。
  • @k102 是的,替换对我有用,但巴塞尔说它对他不起作用。我会说他必须玩弄编码直到它起作用。
【解决方案2】:

大信呢, 我的解决方案是:

function url_make($str){
    $before = array('ı', 'ğ', 'ü', 'ş', 'ö', 'ç', 'İ', 'Ğ', 'Ü', 'Ö', 'Ç'); // , '\'', '""'
    $after   = array('i', 'g', 'u', 's', 'o', 'c', 'i', 'g', 'u', 'o', 'c'); // , '', ''

    $clean = str_replace($before, $after, $str);
    $clean = preg_replace('/[^a-zA-Z0-9 ]/', '', $clean);
    $clean = preg_replace('!\s+!', '-', $clean);
    $clean = strtolower(trim($clean, '-'));

return $clean;
}

echo url_make('Bu Çocuğu Kim İşe Aldı'); // bu-cocugu-kim-ise-aldi
echo url_make('Birisi"nin adı'); // birisinin-adi
echo url_make("I'll make all happen"); // ill-make-all-happen

要产生 i-ll-make-all-happen 而不是 ill-make-all-happen,只需在 $before 列表中添加 '\'' 和 '"',然后在 $before 列表中添加 ' ' 和 ' '之后的列表

【讨论】:

    最近更新 更多