[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Удивительно что работает. Наверно это глюк.
redreem
У меня радость и недоумение - приспичило парсить прокси ОТСЮДА, до этого регулярки не то чтобы стороной обходил, но панически боялся. А тут че-то дай думаю попробую... Попробовал... На тестовой строке - РАБОТАЕТ! Причем как-то сразу заработало, даже ниче не сматерилось. Может глянете где я накосячил, ибо такого быть не может!

Небольшое описание задачи: на вышеуказанном сайте адреса лежат в открытом виде, а их порты "типа" шифруются 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 выдирать из сайта надо?

Спустя 46 минут, 41 секунда (17.01.2012 - 10:04) redreem написал(а):
попробуй спарси свежие прокси с указанного ресурса smile.gif

Спустя 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> не нужно у тебя разделители не /

Все выше описанное это просто издержки практики, в твоем случае и так все хорошо.

Спустя 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 до бесконечности, то это +

А насчёт слеша я понял, моя ошибка. Все остальные полезные советы выше написали, как можно сократить и сделать более простым.

Спустя 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 написал(а):
Немножко длиннее, но для пустых строк, где не надо париться с экранизацией, мне кажется, лучше smile.gif

Спустя 7 минут, 10 секунд (18.01.2012 - 01:01) Winston написал(а):
inpost
Первое preg_quote - вообще не нужно.
Второе preg_quote только для экранирования . между document.write, потому проще добавить \
И шаблон реги нужно заключить в ', чтобы не нужно было экранировать "
К тому же вместо preg_quote лучше написать \Q...\E (как сказал выше duhon) чтобы экранировать метасимволы, эффект тот же, но шаблон короче стает smile.gif

Спустя 9 минут, 15 секунд (18.01.2012 - 01:10) inpost написал(а):
Winston
Вопрос не в том, чтобы сократить, а в том, чтобы отделить реальный шаблон, он простого содержания. Поэтому и поставил все 3 для простой демонстрации работы. К тому же можно каждый участок с новой строки начать, или через ранее созданные переменные.
А насчет шаблона реги - я же заключил в одинарные smile.gif
\Q\E - первый раз слышу и никогда на практике не видел.

Спустя 4 минуты, 24 секунды (18.01.2012 - 01:14) redreem написал(а):
ну да, отделять содержание - это семантичнее smile.gif для себя строгое визуальное разграничение получается.
конечно если не учитывать вопрос оптимизации по скорости.
в моем случае скорость не важна.

Спустя 1 минута, 32 секунды (18.01.2012 - 01:16) Winston написал(а):
Добавляется модификатор x и можно форматировать шаблон по своему вкусу
$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 написал(а):
да, для этого стоило написать хартию smile.gif столько приколов узнал в регулярках smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.