Php 将路径编码为html valid的最佳方法;id";或;名称“;标签

Php 将路径编码为html valid的最佳方法;id";或;名称“;标签,php,javascript,html,path,encode,Php,Javascript,Html,Path,Encode,我有一个可编辑的文件系统,用户可以在其中提交表单中的更改 我想使用文件的路径作为名称或ID标记 因为我怀疑我是第一个面对这一点的人,所以可能有更好的方法 示例: path: ../../disney/mouse/mickey.php 已知限制: Jquery: no periods (.) and colons (:) HTML : Only letter, digits,hyphens ("-"), underscores ("_"), colons (":"), and periods

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

我想使用文件的路径作为名称或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必须能够以两种方式轻松编码/解码字符串。 我用不寻常的模式替换“/”和“.”

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

问候:>


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

这样做绝对没有意义

您可以像其他人一样,始终将数据作为值而不是标识符进行处理。

将路径存储为具有某种通用名称的字段值。没什么大不了的。

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

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

$old = '../../disney/mouse/mickey.php';
$new = preg_replace('/[^a-z0-9]/i', '_', $old);
echo $new;
//Outputs: "______disney_mouse_mickey_php"
您肯定希望修改此选项以添加更多允许的字符。限制越少,非唯一id/名称属性发生冲突的可能性就越小

如果您想要一个不太可能具有非唯一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"
函数customPathEncode($old)
{
$chars_allowed='abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyzo123456789';
$escape_char='%';
$new='';
$old_length=strlen($old);
对于($i=0;$i<$old_length;++$i)
{
if(false==strpos($chars_允许,$old[$i]))
{
$new.=$escape_char.bin2hex($old[$i]);
}
其他的
{
$new.=$old[$i];
}
}
退回$new;
}
echo customPathEncode('../../disney/mouse/mickey.php');
//输出:“%2e%2e%2f%2e%2e%2f迪斯尼%2f鼠标%2f米老鼠%2ephp”

我使用的是Java,我通过编码/解码文件路径的十六进制表示的路径来解决这个问题

我不太熟悉PHP,但我想您可以使用&来实现这个目的


希望这有帮助…

我不同意。1.你建议我使用比我的方法加倍的输入类型。2.我需要该路径能够快速访问ajax和jquery修改。3.谷歌和微软也用路径字符串作为名称来处理他们的一些表单。我不知道它们是如何编码的,它只包含%,字母和数字。我不建议任何东西加倍。如果需要快速修改,请使用JSON。我不明白你的问题。看起来像是一时兴起。所有的文件都可以通过codemirror编辑。必须绑定内容和路径。您建议我使用两个输入字段,一个包含内容和简单的id/名称,另一个包含值“path”和name/id,将它们连接到相应的内容字段。还有别的吗?哦,是的。你的意思是这样一个加倍。我现在明白了。你将节省大量的土地。恭喜你,谢谢。我不介意提交两个字段,但我认为你的方法使整个事情复杂化了。让我问你:你将如何将这两个字段相互链接?我会尝试一下,因为你是一个最受尊敬的人:)谢谢,我已经在使用这种方法了。但我正在寻找一种更好的,也许是JS和PHP内置的方式。或者一些只使用字母和数字的内置编码函数。base64_encode()将生成一个唯一的字母和数字字符串,但它也像md5一样不可读。您正在描述的函数不存在,该函数将创建一个唯一但保持可读性的函数。你必须自己创建它。它们也需要可以被js解码。编写自定义函数需要客户端延迟。在自定义JS函数中对字符串进行编码/解码的时间可以忽略不计。这不是一个密集的过程,如果正确实施并在现代浏览器上使用,不会导致性能的显著下降。自定义函数是实现所需功能的唯一方法。没有本机函数,因为您打算执行的操作被认为是错误的做法。我也不会使用路径,而是使用数字标识符。用户永远不应该看到字段名——为什么要在那里写一些有意义的东西呢?自从用户上传文件名后,这些文件名就已经为用户所知了。保存的是html_目录之外的文件,甚至不需要随机包含文件夹。因此,您使事情变得不必要的复杂,需要创建文件名验证函数<代码>*耸耸肩*有些人喜欢无中生有地发明问题…@你的常识哈哈,是的,你可能是对的。但我真的不明白除了使用NAME标记或附加