Недавно обкатал новую интересную функцию на DC портале. Для неё использовал в классе парсера функцию PHP «preg_replace_callback«. Суть функции заключается в том что она берёт параметром функцию обратного вызова ко всем найденным выражениям и найденное заменяет тем что функция вернула.

Внутри функции заключил 2 функции: первая, format_size, формирует размер, кстати вот она:

  1. function format_size ($size, $arr=false)
  2. {
  3.  $units = '';
  4.  if ($size <= 1024)
  5.  {
  6.  $units = "b";
  7.  } else {
  8.         if ($size < 1048576) # 1024^2
  9.         {
  10.         $units = "Kb";
  11.         $size = $size/1024;
  12.  
  13.  } else {
  14.   if ($size < 1073741824) # 1024^3
  15.  {
  16.     $units = "Mb";
  17.     $size = $size/(1048576);
  18.         } else {
  19.          if ($size < 1099511627776) # 1024^4
  20.                 {
  21.                 $units = "GB";
  22.                 $size = $size/(1073741824);
  23.                 } else {
  24.                   if ($size < 1125899906842624) # 1024^5
  25.                     {
  26.                     $units = "Tb";
  27.                     $size = $size/(1099511627776);
  28.                     } else {
  29.                     $units = "Eb";
  30.                     $size = $size/(1125899906842624); # 1024^5
  31.                                 }
  32.                                 }
  33.                         }
  34.                 }
  35.         }
  36.  
  37.  
  38.         if ($arr)
  39.                 return array(round($size,2),$units);
  40.         else
  41.                 return round($size,2).' '.$units;
  42. }

Вторая, rep_magnet, берёт этот размер и формирует, собственно Magnet-ссылку.

  1. function rep_magnet ($s)
  2. {
  3. if (@$s[1]) return $s[0]; // If have '[url=' at the start - return not modiffed string
  4. $link = $s[0];
  5. $link = str_replace ('"', '"', $link);
  6. $name = htmlspecialchars(urldecode($s[4]));
  7. $size = format_size($s[3]);
  8. return '<img src="/favicon.png/" alt="" /><a href="'.$link.'">Скачать файл из DC  : <strong>'.$name.'</strong></a> ('.$size.')';
  9. }

Если функция находит символ равно, в регулярном выражении, обработки не происходит, сделано, для экранирования ссылок заключённых в тег [url и во избежании повторного парсинга.

В итоге получается такая регулярка:

$source = preg_replace_callback ('/([=\'"`])%3Fmagnet:\%3Fxt=urn:tree:tiger:([a-z0-9] )&xl=([0-9] )&dn=([^<\s\[\]] )/uims', 'rep_magnet', $source );

Вот так это выглядит в работе:



Статью пока никто не комментировал. Ваш комментарий может стать первым.

Войдите или зарегистрируйтесь, чтобы написать комментарий.