对要用作html有效路径的路径进行编码的最佳方式“;id”;或“;name”;标签


best way to encode a path to be used as html-valid "id" or "name" tag

我有一个可编辑的文件系统,用户可以在其中提交表单中的更改。

我想使用文件的路径作为NAME或ID标签。

既然我怀疑我是第一个面对这种情况的人,也许还有更好的方法。

示例:

path: ../../disney/mouse/mickey.php

已知限制:

Jquery: no periods (.) and colons (:) 
HTML : Only letter, digits,hyphens ("-"), underscores ("_"), colons (":"), and periods (".")
HTML5: All but no spaces ( ) and at least 1 char.

要求PHP和JAVASCRIPT能够以两种方式轻松地对字符串进行编码/解码。atm我通过替换"/"&"."有着不同寻常的图案。

你建议使用哪种编码?有没有什么东西可以缩小路径但保持唯一??

问候:>

编辑:用户可以更改和编辑文件中的代码。为什么你建议我为每个链接路径和内容的字段使用额外的输入?我看不出这有什么意义,因为如果名称或id标签编码正确,这不是问题。

您不应该使用您的值作为标识符。这不是一个好的做法,这就是你遇到这个问题的原因。但如果你无论如何都想这么做。。。

如果要对所有语言使用单个字符串,则需要创建一个排除每种语言中所有受限字符的单个字符串。如果受限字符是路径的一部分,那么事情就更难保持唯一性。我建议您使用完整路径,然后使用preg_replace()来更改所有不需要下划线的字符。

$old = '../../disney/mouse/mickey.php';
$new = preg_replace('/[^a-z0-9]/i', '_', $old);
echo $new;
//Outputs: "______disney_mouse_mickey_php"

你肯定会想要修改它来添加更多允许的字符。限制得越少,非唯一id/name属性发生冲突的可能性就越小。

如果您想要一个不太可能具有非唯一id/名称的方法,那么您可以将路径封装在md5()(PHP)中以创建md5哈希。这本书读起来不太友好,但对于大多数非关键目的来说,应该足够独特。

$old = '../../disney/mouse/mickey.php';
$new = md5($old);
echo $new;
//Outputs: "403d07916233847221263553573c5321"

针对您的评论,这是我的最后一次尝试。这个/custom/函数将对源中唯一且可读的路径进行编码。这也将允许您解码到您的原始路径字符串。允许的字符和转义符是可自定义的,这样您就可以找到一个在所有需要的语言中都可用的字符。

function customPathEncode($old)
{
    $chars_allowed = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $escape_char = '%';
    $new = '';
    $old_length = strlen($old);
    for($i = 0; $i < $old_length; ++$i)
    {
        if(false === strpos($chars_allowed, $old[$i]))
        {
            $new .= $escape_char.bin2hex($old[$i]);
        }
        else
        {
            $new .= $old[$i];
        }
    }
    return $new;
}
echo customPathEncode('../../disney/mouse/mickey.php');
//Output: "%2e%2e%2f%2e%2e%2fdisney%2fmouse%2fmickey%2ephp"

这样做毫无意义。

您可以像所有人一样,始终将数据处理为值,而不是标识符
将路径存储为具有某个通用名称的字段值。没什么大不了的。

我使用的是Java,我通过对文件路径的hex表示的路径进行编码/解码来解决这个问题。

我不太熟悉PHP,但我想你可以使用bin2hex&hex2bin。

希望这能帮助。。。