【问题标题】:PHP: URL friendly strings [duplicate]PHP:URL友好字符串[重复]
【发布时间】:2011-04-04 23:54:55
【问题描述】:

可能重复:
How to handle diacritics (accents) when rewriting 'pretty URLs'

我想用“普通”字符(a-z 和 0-9 之间的字符)替换特殊字符,例如 Å Ä Ö Ü é。空格当然应该用破折号代替,但这不是真正的问题。

也就是说,我想转这个:

en räksmörgås

进入这个:

en-raksmorgas

最好的方法是什么?

提前谢谢你。

【问题讨论】:

标签: php string url


【解决方案1】:

您可以使用iconv 进行字符串替换...

$string = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $string);

基本上,它会transliterate 可以使用的字符,并删除它不能使用的字符(不在 ASCII 字符集中)...

然后,只需将空格替换为str_replace

$string = str_replace(' ', '-', $string);

或者,如果您想变得花哨,您可以使用简单的正则表达式将所有连续的空白字符替换为单个破折号:

$string = preg_replace('/\\s+/', '-', $string);

编辑 正如@Robert Ros 指出的那样,您需要在使用iconv 之前设置区域设置(取决于您系统的默认设置)。只需在iconv 行之前执行此行:

setlocale(LC_CTYPE, 'en_US.UTF8');

【讨论】:

  • +1 另见:stackoverflow.com/questions/1284535/php-transliteration 顺便说一句,正确设置您的语言环境以使 iconv 音译正常工作非常重要。
  • @Robert Ros:谢谢,我已将其添加到答案中...
  • 太棒了!但我得到的是 'a"' 而不是 'ä'。这不是什么大问题,我只需要运行 preg_replace 即可删除除字符之外的所有内容。但真的是这样吗?我只是好奇。
  • @Robert 谢谢,我一直想知道为什么有时 iconv 音译有效,有时却无效。
  • 嗯?你得到一个引号字符?我在我的机器上测试了它,它运行良好(我得到了你预期的输出)。你先跑setlocale了吗?
【解决方案2】:

查看http://php.net/manual/en/function.strtr.php

<?php
$addr = strtr($addr, "äåö", "aao");
?>

【讨论】:

  • 但在这种情况下,我必须列出所有这些特殊字符——我想避免这种情况。
  • 是的。在这种情况下,我认为@ircmaxell 的答案更合适。 :)
【解决方案3】:

一个经常用于此的巧妙技巧是调用htmlentitites,然后运行

preg_replace('/&(\w)(acute|uml|circ|tilde|ring|grave);/', '\1', $str);

摆脱变音符号。一个更完整(但通常不必要地复杂)的解决方案是使用 Unicode 分解算法来拆分变音符号,然后删除所有不是 ASCII 字母或数字的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 2014-06-25
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多