Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式匹配和编码字符串中的重复字符_Php_Regex_Rot13 - Fatal编程技术网

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

Php 正则表达式匹配和编码字符串中的重复字符,php,regex,rot13,Php,Regex,Rot13,我的问题是我的URL访问键看起来像“bd333d”。我需要的字符串长度不超过原来的长度,但可以更短。我想转换/模糊字符串中的重复字符,并能够将它们转换回原始字符。PHP已经可以进行字符串压缩,那么为什么您要提出自己的算法呢?关于将gzip压缩与urlencoding相结合的一些极好的建议 您不会说是在内部存储这些字符串,还是将它们用作URL的一部分。如果是前者,那么这就更容易了,因为您可以将其存储为更紧凑的二进制文件。这对于preg\u replace\u回调来说是一个很好的任务 $str =

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

PHP已经可以进行字符串压缩,那么为什么您要提出自己的算法呢?关于将gzip压缩与urlencoding相结合的一些极好的建议


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

这对于preg\u replace\u回调来说是一个很好的任务

$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;
}
function ROT\u by\u strpos($s,$type='in')){
$index=“abcdefghijklmnopqrstuvwxyz123456789abcdefghijklmnopqrstuvxyz”;
对于($n=0;$n=count($k)){
$adv=$key+$i-count($k);
$new_key=$adv;
}否则{
$new_key=$key+i;
}
}
$rot.=$k[$new_key];
}
返回$rot;
}

这假设可能的字符来自$index和代码字符串长度,您可以使用第一个解决方案,并避开自然出现的管道,您需要将其设置为多小?也许将其转换为二进制,然后使用解决方案一会使其更小?如果人们仍然可以看到编码的密钥,并使用它们-有什么安全性好处?@Mazzzz:基本上只是对字符串进行置乱以避免重复字符,但保持相同的字符串长度。你的第一个想法是。那么重点是什么?我想你想增加一点隐私?