2012-03-16 1 views
1

私はユーザーがフォームで変更を送信できる編集可能なファイルシステムを持っています。html有効な "id"タグまたは "name"タグとして使用されるパスをエンコードする最も良い方法

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私は "/" & "を置き換えて行います。"珍しいパターンで。

あなたがアドバイスしているコードはどれですか?また、パスをSHRINKSするがユニークなものがありますか?

よろしく:>

EDIT:ユーザーが変更したファイルからコードを編集することができます。パスとコンテンツをリンクするフィールドごとに入力を追加することをお勧めします。名前やidタグが適切にエンコードされていれば問題はないので、私はその点を見ません。

+0

私はパスを使用するのではなく、数字の識別子を使用します。ユーザーはフィールド名を見たことがない - なぜそこに意味のあるものを書くのはどうですか? –

+0

ファイル名はアップロードしてから既にユーザに知られています。 html_directoryの外にあるファイルは、ランダムに入っているフォルダでも不要です。 – Email

+0

それで、不必要に複雑になるため、ファイル名検証機能を作成する必要があります。 '* shrug *'誰かがどこからでも問題を作り出すのを好む... –

答えて

1

識別子として値を使用しないでください。これは良い習慣ではないため、この問題が発生しています。しかし、とにかくやりたければ...

すべての言語に単一の文字列を使用する場合は、各言語で見つかったすべての制限付き文字を除外する単一の文字列を作成する必要があります。制限された文字がパスの一部である場合、一意に保つのがより難しくなります。私は完全なパスを取ってから、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は、ソース内でユニークで読み取り可能なパスをエンコードします。これにより、元のパス文字列にデコードすることもできます。許可された文字とエスケープ文字はカスタマイズ可能なので、必要なすべての言語で使用できる文字を見つけることができます。

function customPathEncode($old) 
{ 
    $chars_allowed = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
    $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" 
+0

私はすでにそのアプローチを使用しています。より良い、おそらくJSとPHPの方法で構築されたを探しています。または文字とディギットだけを使用するいくつかの組み込みエンコード関数 – Email

+0

base64_encode()は一意の文字と数字だけの文字列を生成しますが、md5と同様に読むこともできません。一意であるが読み込み可能なままになる、記述している関数は存在しません。それを自分で作成する必要があります。 –

+0

jsでもデコード可能である必要があります。それを行うためのカスタム関数を書くことは、クライアント側で遅れが必要です。 – Email

1

これは絶対に意味がありません。

誰もがそうであるように、識別子ではなく値として常にデータを処理できます。
パスをフィールドの値として一般名で保存します。大したことではありません。

+0

は同意できません。私は私のアプローチよりも2倍の入力タイプを使用することをお勧めします。 2.私はAJAXやjQueryの修正のためにパスにすばやくアクセスできる必要があります。 3. GoogleとMicrosoftはフォームの一部をパス文字列で名前として扱います。私は彼らがどのようにエンコードするかを正確にはわかりませんが、それは%、文字、およびディギットのみを含んでいます。 – Email

+0

私は何かを倍増させるつもりはありません。速い変更が必要な場合は、JSONを使用してください。私はあなたの問題を理解していません。私に気まぐれに見える。 –

+0

すべてのファイルはcodemirrorで編集可能です。コンテンツとパスをバインドする必要があります。コンテンツと簡単なID /名前の2つの入力フィールドと、適切なコンテンツフィールドに接続する値「パス」と名前/ IDの2つの入力フィールドを使用するようにお勧めします。 2フィールド他の方法は? – Email

0

Iは、Javaを使用している、私はに/ファイルパスのヘクス表現から符号化/復号化経路によって、これを解決しました。

私はPHPに非常に慣れていないんだけど、私はあなたがこの目的のためにbin2hex & hex2binを使用することができると思います。

希望します。

関連する問題