我的问题是我的 URL 访问密钥看起来像“Bd333333d”。我需要字符串长度不超过原来的长度,但可能会更短。我想转换/混淆字符串中的重复字符,并能够将它们转换回原始字符。
问问题
469 次
3 回答
0
更新:感谢您的帮助!在对混合 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
可能有一种更优雅的方法可以做到这一点,但它确实有效。如果您想添加一些内容,我们将不胜感激任何反馈或改进。:)
于 2011-04-29T19:09:22.420 回答
0
PHP 已经可以进行字符串压缩了,那你为什么要提出自己的算法呢?有关将 gzip 压缩与 urlencoding 相结合的一些极好的建议,请参阅这篇文章。
您不会说是在内部存储这些字符串还是将它们用作 URL 的一部分。如果是前者,那就更容易了,因为您可以将它存储为更紧凑的二进制文件。
于 2011-04-27T05:01:13.343 回答
0
这是 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
);
}
于 2011-04-27T05:05:30.723 回答