Парсинг 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)
- else
- }
Вторая, 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];
- $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 ('/([=\'"`])%3Fmagnet:\%3Fxt=urn:tree:tiger:([a-z0-9] )&xl=([0-9] )&dn=([^<\s\[\]] )/uims', 'rep_magnet', $source );
Вот так это выглядит в работе: