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



我的问题是,我有URL访问键看起来像"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
    );
}

更新:谢谢你的帮助!在做了一些关于混合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

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

相关内容

  • 没有找到相关文章

最新更新