Автоматическое формирование Magnet-ссылок
Недавно обкатал новую интересную функцию на DC портале. Для неё использовал в классе парсера функцию PHP «preg_replace_callback«. Суть функции заключается в том что она берёт параметром функцию обратного вызова ко всем найденным выражениям и найденное заменяет тем что функция вернула.
Внутри функции заключил 2 функции: первая, format_size, формирует размер, кстати вот она:
function format_size ($size, $arr=false) { $units = ''; if ($size < = 1024) { $units = "b"; } else { if ($size < 1048576) # 1024^2 { $units = "Kb"; $size = $size/1024; } else { if ($size < 1073741824) # 1024^3 { $units = "Mb"; $size = $size/(1048576); } else { if ($size < 1099511627776) # 1024^4 { $units = "GB"; $size = $size/(1073741824); } else { if ($size < 1125899906842624) # 1024^5 { $units = "Tb"; $size = $size/(1099511627776); } else { $units = "Eb"; $size = $size/(1125899906842624); # 1024^5 } } } } }; if ($arr) return array(round($size,2),$units); else return round($size,2).' '.$units; }
Вторая, rep_magnet, берёт этот размер и формирует, собственно Magnet-ссылку.
function rep_magnet ($s) { if (@$s[1]) return $s[0]; // If have '[url=' at the start - return not modiffed string $link = $s[0]; $link = str_replace ('"', '"', $link); $name = htmlspecialchars(urldecode($s[4])); $size = format_size($s[3]); return '<img src="/favicon.png/" alt="" /><a href="'.$link.'">Скачать файл из DC++: <strong>'.$name.'</strong></a> ('.$size.')'; }
Если функция находит символ равно, в регулярном выражении, обработки не происходит, сделанно, для экранирования ссылок заключённых в тег [url и воизбежании повторного парсинга.
В итоге получается такая регулярка:
$source = preg_replace_callback ('/([=\'"`])?magnet:\?xt=urn:tree:tiger:([a-z0-9]+)&xl=([0-9]+)&dn=([^<\s\[\]]+)/uims', 'rep_magnet', $source );
Вот так это выглядит в работе:

Шож форматирование такое ужашное?
«if ($size <= 1024)»
Это что за палево? )
Да это здешний тапограф, мать его, никак не отлажу.