我正在准备PHP中的一个函数来自动转换字符串以用作URL(* .html)中的文件名。尽管ASCII应该用于安全方面,但对于搜索引擎优化需要我需要允许文件名使用任何语言,但我不希望它包括除短划线( - )和下划线(_)之外的标点符号,字符喜欢*%$#@“'不应该被允许。
空格应转换为破折号。
我认为使用Regex将是最简单的方法,但我不确定如何处理UTF8字符串。
我的ASCII函数如下所示:
function convertToPath($string)
{
$string = strtolower(trim($string));
$string = preg_replace('/[^a-z0-9-]/', '-', $string);
$string = preg_replace('/-+/', "-", $string);
return $string;
}
谢谢,
罗伊。
答案 0 :(得分:4)
如果选择了UTF-8模式,您可以使用
Letter (根据Unicode常规类别 - 请参阅PHP文档Regular Expression Details) >/\P{L}+/
所以我尝试以下(未经测试):
function convertToPath($string)
{
$string = mb_strtolower(trim($string), 'UTF-8');
$string = preg_replace('/\P{L}+/', '-', $string);
$string = preg_replace('/-+/', "-", $string);
return $string;
}
请注意,您会在UTF-8字符串上获得strtolower()
的问题,因为它会让您遇到多字节字符 - 请改用mb_strtolower()
。
答案 1 :(得分:4)
我认为对于搜索引擎优化需求,您应该坚持使用网址中的ASCII字符。
理论上,URL中允许使用更多字符。实际上,大多数系统只解析ASCII可靠。
此外,许多自动解析链接脚本会阻塞非ASCII字符。因此,允许在您的网址中使用非ASCII字符的网址会大大减少在用户生成的内容中显示(正确)的链接更改。 (如果你想要这样一个脚本的例子,看一下stackoverflow脚本,例如它在括号上窒息)
您还可以查看: How to handle diacritics (accents) when rewriting ‘pretty URLs’
接受的解决方案是转换非ASCII字符:
<?php
$text = iconv('UTF-8', 'US-ASCII//TRANSLIT', $text);
?>
希望这有帮助