Делая очередной парсер натолкнулся на ситуацию когда почтовик шифровали и приводили его в читабельный вид с помощью JavaScript. Всё бы ничего, но парсил cUrl-ом, а он JS не понимает. Впринципе, мне повезло. Я нашел в гугле исходники на хабре.
Да, на хабре были функции кодирования и декодирования на JS и была фунька кодирования на PHP, но мне то надо было обратное. В силу того, что знаний по JS кот наплакал, потерял много времени на понимание самого процесса декодирования. Как только понял суть работы каждой фуньки, тогда стало все ясно 🙂
Внимание! Для целостности смысла заметки будет копипаст.
Функции на JS
function encode(email, text, tpl) { var t = tpl.replace(/{e}/g, email); var a = t.replace(/{text}/g, text); t = ""; for (i = 0; i < a.length; i++) { if (a.charCodeAt(i) <= 127) { t += (String.fromCharCode(Math.floor(a.charCodeAt(i) / 16) + 65)) t += (String.fromCharCode(a.charCodeAt(i) % 16 + 65)); } else { t += a.charAt(i); } } return t; }
function decode(a) { var t = ""; for (i = 0; i < a.length; i++) { if (a.charCodeAt(i) <= 127) { t += String.fromCharCode((a.charCodeAt(i) - 65) * 16 + (a.charCodeAt(++i) - 65)) } else { t += a.charAt(i); } } return t; }
Кодируем:
encode("name@domain.com", "Имя", "<a href=\"mailto:{e}\">{text}</a>");
Получаем:
DMGBCAGIHCGFGGDNCCGNGBGJGMHEGPDKGOGBGNGFEAGEGPGNGBGJGOCOGDGPGNCCDOИмяDMCPGBDO
Декодируем:
decode("DMGBCAGIHCGFGGDNCCGNGBGJGMHEGPDKGOGBGNGFEAGEGPGNGBGJGOCOGDGPGNCCDOИмяDMCPGBDO");
Получаем:
<a href="mailto:name@domain.com">Имя</a>
Функции на PHP
function encode_email($email, $text = null, $tpl = null) { if (empty($email)) return false; if ($tpl === null) $tpl = "<A HREF=\"mailto:{e}\">{text}</A>"; if ($text === null) $text = $email; $t = str_replace('{e}', $email, $tpl); $a = str_replace('{text}', $text, $t); $result = ''; for($i = 0; $i < strlen($a); $i++) { if (ord($a[$i]) <= 127) { $result .= chr(floor(ord($a[$i]) / 16) + 65) . (string)chr(ord($a[$i])%16 + 65); } else { $result .= (string)$a[$i]; } } }
function decode_email($a) { $result = ''; for($i = 0; $i < strlen($a); $i++) { if (ord($a[$i]) <= 127) { $result .= chr((ord($a[$i]) - 65) * 16 + (ord($a[++$i]) - 65)); } else { $result .= ord($a[$i]); } } return $result; }
Кодируем:
print_r(encode_email('name@domain.com'));
Получаем:
DMGBCAGIHCGFGGDNCCGNGBGJGMHEGPDKGOGBGNGFEAGEGPGNGBGJGOCOGDGPGNCCDOИмяDMCPGBDO
Декодируем:
print_r(encode_email("DMGBCAGIHCGFGGDNCCGNGBGJGMHEGPDKGOGBGNGFEAGEGPGNGBGJGOCOGDGPGNCCDOИмяDMCPGBDO"));
Получаем:
<a href="mailto:name@domain.com">Имя</a>
17 августа, 2013