Понадобилось сделать такую штуковину, в гугле ничего не нашел, кода сделал пришла мысль что гораздо удобнее обойтись по другому, но не пропадать же этому: PHP: $str = preg_replace('/[^a-z]/', '', strtolower($str)); $len = strlen($str); $str = $str."\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; $out = ''; for($i=0; $i<$len; ++$i) { $str[$i] = ord($str[$i]) - 97; } for($i=0; $i<$len; ++$i) { $out .= chr(($str[$i] << 3) | (($str[++$i] & 0x1F) >> 2)); $out .= chr(($str[$i] << 6) | (($str[++$i] & 0x1F) << 1) | (($str[++$i] & 0x1F) >> 4)); $out .= chr(($str[$i] << 4) | (($str[++$i] & 0x1F) >> 1)); $out .= chr(($str[$i] << 6) | (($str[++$i] & 0x1F) << 2) | (($str[++$i] & 0x1F) >> 3)); $out .= chr(($str[$i] << 5) | ($str[++$i] & 0x1F)); } $out = rtrim($out, "\x00"); echo $out; Конечно можно было и улучшить убрав добавление лишних NULL-байтов, объединив все в одну строку, сразу применив & 0x1F ко всему(Может еще что забыл? Хотел-бы услышать), но использовать все равно не придется.
Ну просто поумничаю, так как не разобрал суть алгоритма strtolower выполнится первей чем preg_replace получается он выполниться для всей строки... оптимальнее (хотя для php это не критично) было бы сделать сначала preg_replace('/\W/','') а потом strtolower($str); P.S: Дааа, на Си это выглядело бы элегантнее http://c0dedgarik.blogspot.ru/2012/04/hex-2-bin.html