私の問題は、「Bd333333d」のようなURLアクセスキーを持っていることです。文字列の長さは元の長さより長くする必要がありますが、短くすることができます。文字列内の重複する文字を変換/難読化して、元の文字に戻すことができるようにしたい。
3 に答える
更新: ご協力ありがとうございます! ハイブリッド ROT13 のコンセプトについていくつかの作業を行った後、自分に合ったものを思いつきました。不自由で申し訳ありませんが、私自身の解決策を投稿してください。
function ROT_by_strpos($s,$type='in'){
$index = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for ($n = 0; $n<strlen($index); $n++){
$k[] = substr( $index,$n ,1);
}
if($type == 'out'){
$k = array_reverse($k);
}
$rot = '';
$count = 1;
$len = strlen($s);
for ($n = 0; $n<strlen($s); $n++){
$key_in[] = substr( $s,$n ,1);
}
for ( $i = 0; $i < $len; $i++ ){
$key = array_search($key_in[$i], $k)+1;
if($type == 'in'){
if($key+$i > count($k)){
$rev = $key+$i - count($k);
$new_key = $rev;
}else{
$new_key = $key+$i;
}
}else{
if($key+$i >= count($k)){
$adv = $key+$i - count($k);
$new_key = $adv;
}else{
$new_key = $key+$i;
}
}
$rot .= $k[$new_key];
}
return $rot;
}
これは、可能性のある文字が $index からのものであり、コード文字列の長さが 10 文字以下であることを前提としています。
使用法:
$key = "Bd333333d";
$in = ROT_by_strpos($key,'in');
$out = ROT_by_strpos($in,'out');
echo "$key - $in - $out"; //Bd333333d - Cf6789ABm - Bd333333d
これを行うにはおそらくもっとエレガントな方法がありますが、うまくいきます。何かを追加したい場合は、フィードバックや改善をいただければ幸いです。:)
PHP はすでに文字列圧縮を行うことができるのに、なぜ独自のアルゴリズムを考え出す必要があるのでしょうか? gzip 圧縮と urlencoding を組み合わせる優れた提案については、この投稿を参照してください。
これらの文字列を内部に保存しているのか、URL の一部として使用しているのかはわかりません。前者の場合は、はるかにコンパクトなバイナリとして保存できるため、これはさらに簡単です。
これは preg_replace_callback に適したタスクです
$str = 'Bd333333dddd';
function shorten( $str ) {
return preg_replace_callback(
'~(.)\1+~',
function( $matches ) {
return sprintf( '%s.%s', $matches[1], strlen( $matches[0] ) );
},
$str
);
}