我创建了一个CMS,它根据客户端提供的页面标题创建一个页面。
E.g。 “关于我们”被创建为'about-us.php'
它目前使用以下内容删除所有不允许使用的字符,我在代码中添加了当您编辑页面并将其调用为其他内容以便重命名该文件时。
function toAscii($str) {
$clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $str);
$clean = strtolower(trim($clean, '-'));
$clean = preg_replace("/[\/_|+ -]+/", '-', $clean);
return $clean;
}
// Renames the file
rename(toAscii($row_Recordset1['content_title']).".php", toAscii($_POST['content_title']).".php");
但我真的想要允许这些特殊字符,所以我修改了上面的函数来执行以下操作:
function toAscii($str) {
$clean = strtolower($str);
$clean = str_replace(";", "%3B", $clean);
$clean = str_replace("/;", "%2F", $clean);
$clean = str_replace("?", "%3F", $clean);
$clean = str_replace(":", "%3A", $clean);
$clean = str_replace("&", "%26", $clean);
$clean = str_replace("@", "%40", $clean);
$clean = str_replace("=", "%3D", $clean);
$clean = str_replace(" ", "-", $clean);
return $clean;
}
// Renames the file
rename(toAscii($row_Recordset1['content_title']).".php", toAscii($_POST['content_title']).".php");
我知道它不优雅,但它应该在理论上起作用。
没有。
因此,当文件名应为'shows-%2F-exhibitions.php'时,它实际上会显示为'shows - / - exhibitions.php',这显然是不允许的。
如何强制它保留文件名中的十六进制代码而不是应用十六进制代码并再次使用正斜杠?
或者您是否只允许在URL中以任何形状或形式使用正斜杠?
答案 0 :(得分:0)
看看urlencode函数(和相应的urldecode)
顺便说一下,你有一个与str_replace('/;' ...
一致的拼写错误(正斜杠后有多余的分号)
答案 1 :(得分:0)
toAscii功能的通用版本:
function toAscii($str) {
return iconv('UTF-8', 'ASCII//TRANSLIT', $src);
}
将非ascii字符从URL中剥离是很常见的,因此读取和写入这些URL要容易得多。您还可以在URL中包含一些唯一ID,以确保它是唯一的,并保留其他文本以提高链接的可读性。示例:http://example.com/123-some-article。要处理此网址,只需删除数字并搜索数据库,然后比较其余文字以防止创建谷歌炸弹。
如果你真的需要URL中的特殊字符,你需要对它们进行不同的编码,而不是url_encode,因为在PHP脚本获取之前,%编码是由服务器解码的。
答案 2 :(得分:0)
我建议您在文件名中完全禁止a-zA-Z0-9_
以外的任何字符。使用数据库表将好的人类可读名称映射到文件名。确保你也处理“相同”的名字,例如:
Shows/Events --> showsevents.php
Shows-Events --> showsevents1.php