0

我创建了一个 CMS,它根据客户提供的页面标题创建一个页面。

例如,“关于我们”被创建为“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 中使用任何形状或形式的正斜杠?

4

3 回答 3

0

看看 urlencode 函数(和相应的 urldecode)

顺便说一句,您有一个错字str_replace('/;' ...(正斜杠后有多余的分号)

http://php.net/manual/en/function.urlencode.php

http://php.net/manual/en/function.urldecode.php

于 2013-01-29T12:50:44.687 回答
0

您的 toAscii 函数的通用版本:

function toAscii($str) {
    return iconv('UTF-8', 'ASCII//TRANSLIT', $src);
}

从 URL 中去除非 ascii 字符是很常见的,因此读取和写入这些 URL 会容易得多。您还可以在 URL 中包含一些唯一 ID,以确保它是唯一的,并保留附加文本以提高链接的可读性。示例:http ://example.com/123-some-article 。要处理这个 url,只需删除数字并搜索它的数据库,然后比较其余的文本以防止创建谷歌炸弹。

如果您确实需要 URL 中的特殊字符,则需要对它们进行不同于 url_encode 的编码,因为 % 编码在您的 PHP 脚本获取之前由服务器解码。

于 2013-01-29T12:56:56.807 回答
0

我建议完全禁止a-zA-Z0-9_文件名以外的任何字符。使用数据库表将漂亮的人类可读名称映射到文件名。确保您也处理“相同”的名称,例如:

Shows/Events --> showsevents.php
Shows-Events --> showsevents1.php
于 2013-01-29T12:58:13.930 回答