正则表达式匹配和编码字符串中的重复字符

时间:2011-04-27 04:36:32

标签: php regex rot13

我的问题是我的URL访问键看起来像“Bd333333d”。我需要字符串长度不超过原始字符串,但可能更短。我想转换/混淆字符串中的重复字符,并能够将它们转换回原始字符。

3 个答案:

答案 0 :(得分:0)

PHP已经可以进行字符串压缩,那么为什么要想出自己的算法呢? See this post有关将gzip压缩与urlencoding结合使用的一些很好的建议。

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

答案 1 :(得分: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
    );
}

答案 2 :(得分: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和代码字符串长度&lt; = 10个字符长。

用法:

$ key =“Bd333333d”;

$ in = ROT_by_strpos($ key,'in');

$ out = ROT_by_strpos($ in,'out');

回显“$ key - $ in - $ out”; // Bd333333d - Cf6789ABm - Bd333333d

这可能是一种更优雅的方式,但确实有效。如果您想添加一些内容,我们将不胜感激。 :)