Небольшое описание задачи: на вышеуказанном сайте адреса лежат в открытом виде, а их порты "типа" шифруются js. В начале идет скрипт, в котором объявляются случайные переменные, а потом в том месте, где идет вывод порта, через эти переменные порт, собственно - и вычисляется вставкой write прямо в тело.
Вот я и парсю сначала инициализацию переменных, а потом открытые адреса и блок калькуляции... Цветным в теле я выделил получающийся результат.
Что скажете? Где ошибки? Подводные камни? Оптимизация? Сильно не орите - это реально 1-й самостоятельный опыт в регулярках.
Спасибо.
<?php
$content = '
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>PregTest</title>
</head>
<body>';
$content .= 'Список прокси:<br><br>';
$string='
блабла блаб бла
<script type="text/javascript">window.google_analytics_uacct = "UA-8569139-2";</script>
<script type="text/javascript">123</script>
блабла блаб бла
<script type="text/javascript">o5n4=5433;i9h8=8636;t0p6=7661;n4y5=9867;x4l2=2538;l2e5=8597;j0w3=7270;b2x4=6437;w3v2=1746;s9s9=7731;k1t0e5=0^o5n4;y5u1j0=1^i9h8;r8q7x4=2^t0p6;a1h8y5=3^n4y5;q7g7f6=4^x4l2;x4p6v2=5^l2e5;u1o5a1=6^j0w3;m3f6p6=7^b2x4;o5l2q7=8^w3v2;l2b2o5=9^s9s9;</script>
блабла блаб бла
<font class=spy14>58.246.200.114<script type="text/javascript">document.write("<font class=spy2>:<\/font>"+(o5l2q7^w3v2)+(k1t0e5^o5n4))</script></font></td><td colspan=1><font class=spy1>HTTP</font></td><td colspan=1><font class=spy1>HIA</font></td><td colspan=1><font class=spy1>8.803</font></td><td colspan=2><font class=spy14>CN <font class=spy1>Shanghai</font></font></td><td colspan=1><font class=spy1>58.246.200.114</font></td><td colspan=1><font class=spy1>26:12:11-07:23</font></td></tr><tr class=spy1xx><td colspan=1><font class=spy1>3</font>
<font class=spy14>60.209.5.13<script type="text/javascript">document.write("<font class=spy2>:<\/font>"+(o5l2q7^w3v2)+(k1t0e5^o5n4)+(o5l2q7^w3v2))</script></font></td><td colspan=1><font class=spy1>HTTP</font></td><td colspan=1><font class=spy1>HIA</font></td><td colspan=1><font class=spy1>2.019</font></td><td colspan=2><font class=spy14>CN <font class=spy1>Jinan</font></font></td><td colspan=1><font class=spy1>60.209.5.13</font></td><td colspan=1><font class=spy1>26:12:11-07:23</font></td></tr><tr class=spy1xx><td colspan=1><font class=spy1>4</font>
<font class=spy14>213.160.143.150<script type="text/javascript">document.write("<font class=spy2>:<\/font>"+(a1h8y5^n4y5)+(y5u1j0^i9h8)+(r8q7x4^t0p6)+(o5l2q7^w3v2))</script></font></td><td colspan=1>
блабла блаб бла
';
$res_init = preg_match_all("#<script type=\"text/javascript\">([0-9A-Za-z]{1,6}=[0-9]{1,5};){1,}([0-9A-Za-z]{1,6}=[0-9]{1,}\^[0-9A-Za-z]{1,6};){1,}<\/script>#",$string,$out_init);
$content .= '<b>Найдено инициализаций: '.$res_init.'</b><br><br>';
foreach ($out_init[0] as $k => $v) {
$content .= '<b>['.htmlentities($k).']</b>: '.htmlentities($v).'<br><br>';
$content .= $v;
}
$res_proxyAndCalc = preg_match_all("#<font class=spy14>([0-9]{1,3}\.?){4}<script type=\"text/javascript\">document\.write\(\"<font class=spy2>:<\\\/font>\"(\+\([0-9A-Za-z]{1,6}\^[0-9A-Za-z]{1,6}\)){1,}\)</script>#",$string,$out_proxyAndCalc);
$content .= '<b>Найдено прокси и калькуляций: '.$res_proxyAndCalc.'</b><br><br>';
foreach ($out_proxyAndCalc[0] as $k => $v) {
$content .= '<b>['.htmlentities($k).']</b>: '.htmlentities($v).'<br><br>';
$res_pAddr = preg_match_all("#([0-9]{1,3}\.?){4}#",$v,$out_proxyAddr);
$res_pPort = preg_match_all("#<script type=\"text/javascript\">document\.write\(\"<font class=spy2>:<\\\/font>\"(\+\([0-9A-Za-z]{1,6}\^[0-9A-Za-z]{1,6}\)){1,}\)</script>#",$v,$out_proxyPort);
//<script type= "text/javascript ">document .write ( "<font class=spy2>:< \ /font> " + (o5l2q7 ^w3v2 ) )</script>
$content .= 'Найдено адресов: '.$res_pAddr.'<br>';
$content .= 'Найдено портов: '.$res_pPort.'<br><br>';
$content .= '<span style="color:#f44">'.$out_proxyAddr[0][0].'</span>:<span style="color:#2a2">'.$out_proxyPort[0][0].'</span><br><br>';
}
$content .= '</body></html>';
header("Content-type: text/html; charset=Content-type: text/html; charset=windows-1251");
echo $content;
?>
Спустя 20 минут, 54 секунды (26.12.2011 - 09:22) redreem написал(а):
вот еще вариант, который сразу с сайта берет контент - тож работает...
<?php
$content = '
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>PregTest</title>
</head>
<body>';
$content .= 'Список прокси:<br><br>';
$string = file_get_contents('http://spys.ru/proxylist/', false);
$res_init = preg_match_all("#<script type=\"text/javascript\">([0-9A-Za-z]{1,6}=[0-9]{1,5};){1,}([0-9A-Za-z]{1,6}=[0-9]{1,}\^[0-9A-Za-z]{1,6};){1,}<\/script>#",$string,$out_init);
$content .= '<b>Найдено инициализаций: '.$res_init.'</b><br><br>';
foreach ($out_init[0] as $k => $v) {
$content .= '<b>['.htmlentities($k).']</b>: '.htmlentities($v).'<br><br>';
$content .= $v;
}
$res_proxyAndCalc = preg_match_all("#<font class=spy14>([0-9]{1,3}\.?){4}<script type=\"text/javascript\">document\.write\(\"<font class=spy2>:<\\\/font>\"(\+\([0-9A-Za-z]{1,6}\^[0-9A-Za-z]{1,6}\)){1,}\)</script>#",$string,$out_proxyAndCalc);
$content .= '<b>Найдено прокси и калькуляций: '.$res_proxyAndCalc.'</b><br><br>';
foreach ($out_proxyAndCalc[0] as $k => $v) {
//$content .= '<b>['.htmlentities($k).']</b>: '.htmlentities($v).'<br><br>';
$res_pAddr = preg_match_all("#([0-9]{1,3}\.?){4}#",$v,$out_proxyAddr);
$res_pPort = preg_match_all("#<script type=\"text/javascript\">document\.write\(\"<font class=spy2>:<\\\/font>\"(\+\([0-9A-Za-z]{1,6}\^[0-9A-Za-z]{1,6}\)){1,}\)</script>#",$v,$out_proxyPort);
//<script type= "text/javascript ">document .write ( "<font class=spy2>:< \ /font> " + (o5l2q7 ^w3v2 ) )</script>
//$content .= 'Найдено адресов: '.$res_pAddr.'<br>';
//$content .= 'Найдено портов: '.$res_pPort.'<br><br>';
$content .= '<span style="color:#f44">'.$out_proxyAddr[0][0].'</span>:<span style="color:#2a2">'.$out_proxyPort[0][0].'</span><br>';
}
$content .= '</body></html>';
header("Content-type: text/html; charset=Content-type: text/html; charset=windows-1251");
echo $content;
?>
Спустя 2 минуты, 2 секунды (26.12.2011 - 09:24) redreem написал(а):
увидел мелкий косяк - порт парсится вместе с ":" - ну это мелочь.
Спустя 20 дней, 23 часа, 53 минуты, 12 секунд (17.01.2012 - 09:17) Эли4ка написал(а):
redreem
а где этот косяк?а так вроде ничего ..а зачем Вам JS выдирать из сайта надо?
а где этот косяк?а так вроде ничего ..а зачем Вам JS выдирать из сайта надо?
Спустя 46 минут, 41 секунда (17.01.2012 - 10:04) redreem написал(а):
попробуй спарси свежие прокси с указанного ресурса
Спустя 12 часов, 51 минута, 21 секунда (17.01.2012 - 22:55) duhon написал(а):
ну я могу только сказать что не стоит использовать " двойные кавычки в регулярках, что бы не было сюрпризов.
вместо [0-9] можно использовать \d
вместо [a-z] можно использовать \w (почти)
модификатор i избавит от констукций [a-zA-Z]
куски текста где нужно много слешить "<script type=\"text/javascript\">document\.write\(\"<"
можно слешить автоматически функцией preg_quote либо констукцией \Q...\E
везде где возможно использовать preg_match вместо preg_match_all
одинаковые шаблоны типа [0-9A-Za-z]{1,6} можно заменить на ссылки или рекурсивными сылками или вообще пхп константами, а нужные групы сделать именованными
слешить например тут <\/script> не нужно у тебя разделители не /
Все выше описанное это просто издержки практики, в твоем случае и так все хорошо.
вместо [0-9] можно использовать \d
вместо [a-z] можно использовать \w (почти)
модификатор i избавит от констукций [a-zA-Z]
куски текста где нужно много слешить "<script type=\"text/javascript\">document\.write\(\"<"
можно слешить автоматически функцией preg_quote либо констукцией \Q...\E
везде где возможно использовать preg_match вместо preg_match_all
одинаковые шаблоны типа [0-9A-Za-z]{1,6} можно заменить на ссылки или рекурсивными сылками или вообще пхп константами, а нужные групы сделать именованными
слешить например тут <\/script> не нужно у тебя разделители не /
Все выше описанное это просто издержки практики, в твоем случае и так все хорошо.
Спустя 1 час, 33 минуты, 8 секунд (18.01.2012 - 00:28) inpost написал(а):
{1,} - это +
И что это у тебя: \)) ?
И что это у тебя: \)) ?
Спустя 12 минут, 11 секунд (18.01.2012 - 00:40) redreem написал(а):
Цитата |
{1,} - это + |
не понял?
Цитата |
И что это у тебя: \)) ? |
ну это экранирование скобок, которые являются частью искомой строки
$res_pPort = preg_match_all("#<script type=\"text/javascript\">document\.write\(\"<font class=spy2>:<\\\/font>\"(\+\([0-9A-Za-z]{1,6}\^[0-9A-Za-z]{1,6}\)){1,}\)</script>#",$v,$out_proxyPort);
//<script type= "text/javascript ">document .write ( "<font class=spy2>:< \ /font> " + (o5l2q7 ^w3v2 ) )</script>
в коменте видно что именно ищется. или я не прав?
Спустя 4 минуты, 4 секунды (18.01.2012 - 00:44) inpost написал(а):
{} - это ты считаешь количество.
Если от 0 до бесконечности, то это *, если от 1 до бесконечности, то это +
А насчёт слеша я понял, моя ошибка. Все остальные полезные советы выше написали, как можно сократить и сделать более простым.
Если от 0 до бесконечности, то это *, если от 1 до бесконечности, то это +
А насчёт слеша я понял, моя ошибка. Все остальные полезные советы выше написали, как можно сократить и сделать более простым.
Спустя 3 минуты, 17 секунд (18.01.2012 - 00:48) Winston написал(а):
Цитата (redreem @ 17.01.2012 - 23:40) |
не понял? |
4 символа - {1, } можно заменить на 1 - + ;)
Твоя рега может быть сокращена немного
$res_pPort = preg_match_all('#<script type="text/javascript">document\.write\("<font class=spy2>:<\\/font>"(\+\([\da-z]{1,6}^[\da-z]{1,6}\))+\)</script>#isU',$v,$out_proxyPort);
Хотя если еще немного по-плялсать думаю можно еще сжать :)
Спустя 5 минут, 56 секунд (18.01.2012 - 00:54) inpost написал(а):
$res_proxyAndCalc = preg_match_all("#<font class=spy14>([0-9]{1,3}\.?){4}<script type=\"text/javascript\">document\.write\(\"<font class=spy2>:<\\\/font>\"(\+\([0-9A-Za-z]{1,6}\^[0-9A-Za-z]{1,6}\)){1,}\)</script>#",$string,$out_proxyAndCalc);
$res_proxyAndCalc = preg_match_all('#'.preg_quote('<font class=spy14>').'(\d{1,3}\.){4}'.preg_quote('<script type="text/javascript">document.write("<font class=spy2>:</font>"').'(\+\([\w\d]{1,6}\^[\w\d]{1,6}\))+'.preg_quote(')</script>').'#iU',$string,$out_proxyAndCalc);
Спустя 51 секунда inpost написал(а):
Немножко длиннее, но для пустых строк, где не надо париться с экранизацией, мне кажется, лучше
Спустя 7 минут, 10 секунд (18.01.2012 - 01:01) Winston написал(а):
inpost
Первое preg_quote - вообще не нужно.
Второе preg_quote только для экранирования . между document.write, потому проще добавить \
И шаблон реги нужно заключить в ', чтобы не нужно было экранировать "
К тому же вместо preg_quote лучше написать \Q...\E (как сказал выше duhon) чтобы экранировать метасимволы, эффект тот же, но шаблон короче стает
Первое preg_quote - вообще не нужно.
Второе preg_quote только для экранирования . между document.write, потому проще добавить \
И шаблон реги нужно заключить в ', чтобы не нужно было экранировать "
К тому же вместо preg_quote лучше написать \Q...\E (как сказал выше duhon) чтобы экранировать метасимволы, эффект тот же, но шаблон короче стает
Спустя 9 минут, 15 секунд (18.01.2012 - 01:10) inpost написал(а):
Winston
Вопрос не в том, чтобы сократить, а в том, чтобы отделить реальный шаблон, он простого содержания. Поэтому и поставил все 3 для простой демонстрации работы. К тому же можно каждый участок с новой строки начать, или через ранее созданные переменные.
А насчет шаблона реги - я же заключил в одинарные
\Q\E - первый раз слышу и никогда на практике не видел.
Вопрос не в том, чтобы сократить, а в том, чтобы отделить реальный шаблон, он простого содержания. Поэтому и поставил все 3 для простой демонстрации работы. К тому же можно каждый участок с новой строки начать, или через ранее созданные переменные.
А насчет шаблона реги - я же заключил в одинарные
\Q\E - первый раз слышу и никогда на практике не видел.
Спустя 4 минуты, 24 секунды (18.01.2012 - 01:14) redreem написал(а):
ну да, отделять содержание - это семантичнее для себя строгое визуальное разграничение получается.
конечно если не учитывать вопрос оптимизации по скорости.
в моем случае скорость не важна.
конечно если не учитывать вопрос оптимизации по скорости.
в моем случае скорость не важна.
Спустя 1 минута, 32 секунды (18.01.2012 - 01:16) Winston написал(а):
Добавляется модификатор x и можно форматировать шаблон по своему вкусу
Только вместо обычных пробелов, нужно писать \s
$res_pPort = preg_match_all('#
<script type="text/javascript">
document\.write\("<font class=spy2>:<\\/font>"
(\+\([\da-z]{1,6}^[\da-z]{1,6}\))+
\)
</script>#isxU',$v,$out_proxyPort);
Только вместо обычных пробелов, нужно писать \s
Цитата (inpost @ 18.01.2012 - 00:10) |
\Q\E - первый раз слышу |
Цитата (inpost @ 18.01.2012 - 00:10) |
никогда на практике не видел. |
Не все знают некоторые тонкости :)
Спустя 1 минута, 3 секунды (18.01.2012 - 01:17) redreem написал(а):
да, для этого стоило написать хартию столько приколов узнал в регулярках