2011-04-27 307 views
3

我的问题重复的字符是,我有一个看起来像“Bd333333d” URL访问键。我需要的字符串长度不能超过原始长度,但可能会更短。我想转换/模糊字符串中的重复字符,并能够将它们转换回原始。正则表达式匹配和编码在一个字符串

+0

你可以用第一个解决方案,并逃离自然发生的管道,你需要做多少?也许把它翻译成二进制文件,然后使用解决方案可以使它更小? – Ben 2011-04-27 04:48:42

+0

如果人们仍然可以看到编码密钥,并改用它们 - 有什么安全增益? – Orbling 2011-04-27 04:49:23

+0

@mazzzzz:基本上只是加扰字符串以避免重复的字符,但保持相同的字符串长度。 – vanarie 2011-04-27 04:55:42

回答

0

PHP已经可以做字符串压缩,所以你为什么要拿出自己的算法? See this post提供了一些将gzip压缩与urlencoding相结合的优秀建议。

你不说,不管你是在内部存储这些字符串或使用它们作为一个URL的一部分。如果它是前者,那么这更容易,因为你可以将它存储为更紧凑的二进制文件。

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 
    ); 
} 
0

一个很好的任务更新:感谢您的帮助!在做了关于混合ROT13概念的一些工作后,我想出了一些适合我的东西。对不起,是跛脚和张贴自己的解决方案,但在这里它是:

function ROT_by_strpos($s,$type='in'){ 

$index = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

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; 
} 

这个假设可能的字符是从$指数和代码字符串长度< = 10个字符长。

用法:

$关键= “Bd333333d”;

在$ = ROT_by_strpos( '在' $键);

$出= ROT_by_strpos(在$, '出');

echo“$ key - $ in - $ out”; // Bd333333d - Cf6789ABm - Bd333333d

有可能是一个更优雅的方式来做到这一点,但它确实工作。任何反馈或改进将不胜感激,如果你想添加一些东西。 :)