2011-04-27 79 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

有可能是一個更優雅的方式來做到這一點,但它確實工作。任何反饋或改進將不勝感激,如果你想添加一些東西。 :)

相關問題