【发布时间】:2012-02-10 14:07:25
【问题描述】:
我必须将“você-é-um-ás-da-aviação”之类的网址转换为“voce-e-um-as-da-aviacao”,以使其在 SERP 上易于阅读。
我可以做一个普通的替换,但我真的不喜欢列出每个字符,因为我觉得它很笨重,而且我想尽可能地将语言特定的字符排除在源代码之外。
有可能吗?可行吗?
【问题讨论】:
我必须将“você-é-um-ás-da-aviação”之类的网址转换为“voce-e-um-as-da-aviacao”,以使其在 SERP 上易于阅读。
我可以做一个普通的替换,但我真的不喜欢列出每个字符,因为我觉得它很笨重,而且我想尽可能地将语言特定的字符排除在源代码之外。
有可能吗?可行吗?
【问题讨论】:
function url_safe($string){
$url = $string;
setlocale(LC_ALL, 'fr_FR'); // change to the one of your language
$url = iconv("UTF-8", "ASCII//TRANSLIT", $url);
$url = preg_replace('~[^\\pL0-9_]+~u', '-', $url);
$url = trim($url, "-");
$url = strtolower($url);
return $url;
}
【讨论】:
您可以使用 Unicode 基金会提供的规范分解映射(http://www.unicode.org/Public/UNIDATA/ 中的文件)。
然而,这并不像你想象的那么简单——信不信由你,有一个“千卡”符号,其规范分解为四个字符长。
您可能还希望查阅那里的数字等效表,因为“带圆圈的数字 7”可能应该映射到 ASCII 数字 7,等等。
但是,我强烈建议您不要使用这种策略 - 您会为了一点点收益而牺牲文本,并且一旦转换了原始输入,就无法恢复它。
【讨论】:
我建议您将每个特殊字符和它的替换映射到一个数组中,然后用正则表达式替换文本。
我知道您说过您不想使用通用替换,但这是唯一可行的方法。您可以将它们过滤掉(通过检查它们的 ascii 代码是否位于某个范围内),但对于正确的替换它并不相同。
【讨论】:
您可以使用 iconv 的组合将您的字符串作为 ASCII,然后使用一些 preg_replace 来删除不需要的字符。
类似:
$string = "você-é-um-ás-da-aviação";
$collated = iconv('UTF-8', 'ASCII//TRANSLIT', $string);
$filtred = preg_replace('`[^-a-zA-Z0-9]`', '', $collated);
echo $filtred;
【讨论】: