Соответствие регулярному выражению и кодирование повторяющихся символов в строке - PullRequest
3 голосов
/ 27 апреля 2011

Моя проблема в том, что у меня есть ключи доступа URL, которые выглядят как "Bd333333d".Мне нужно, чтобы длина строки была не больше, чем оригинал, но может быть короче.Я хочу конвертировать / скрывать дубликаты символов в строке и иметь возможность конвертировать их обратно в оригинал.

Ответы [ 3 ]

0 голосов
/ 27 апреля 2011

Это хорошая задача для 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 голосов
/ 29 апреля 2011

ОБНОВЛЕНИЕ: Спасибо за вашу помощь! После некоторой работы над гибридной концепцией 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 символов. </p>

Использование:

$ key = "Bd333333d";

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

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

echo "$ key - $ in - $ out"; // Bd333333d - Cf6789ABm - Bd333333d

Возможно, есть более элегантный способ сделать это, но он работает. Любые отзывы или улучшения будут оценены, если вы хотите что-то добавить. :)

0 голосов
/ 27 апреля 2011

PHP уже может выполнять сжатие строк, так почему вы хотите придумать свой собственный алгоритм? См. Этот пост , где приведены отличные предложения по объединению сжатия gzip с кодировкой urlencoding.

Вы не говорите, храните ли вы эти строки внутри или используете их как часть URL.Если это первое, то это еще проще, потому что вы можете просто сохранить его как гораздо более компактный двоичный файл.

...