Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Убираем все кроме цифр
Форумы портала PHP.SU » PHP » Регулярные выражения » Убираем все кроме цифр

Страниц (1): [1]
 

1. GFox - 08 Марта, 2010 - 02:48:36 - перейти к сообщению
Здравствуйте уважаемые знатоки Улыбка
У меня стоит задача сделать рейтинг для одной он-лайн игры, но цель ерунда, сам опыт полезен Улыбка
Осмысливая принцип работы разделил все на блоки
1. форма добавления id персонажа (тут вопросов нет)
2. исходя из id персонажа, указанного в форме, подгружаем страничку в переменную (тоже ясно)
2. вырезаем из указанной странички нужны символы (цифры)
Вот тут то и начинаются проблемы
2.1 Первая проблема, цифры все разные (напишу как в коде, как я понял это имеет значение):
<b>42</b>
<font color=#990000>20/3</font>
(3836444.6)
+209792 (пока писал вопрос подумал, что это можно выводить через +$(где 209792))
[102 / 102]

2.2 проблема два, нужно игнорировать числа, перед которыми стоит # (#2387)

Так как интересно самому додуматься, пытался сделать сам, опираясь на факи и примеры построения условия, но никак не могу сообразить как это сделать.

В принципе, разными способами смог выгрузить все числа, но это 3-4 массива и очень много индексов. В одном массиве так и не получилось вывести все цифры за исключение #.... .
3. так же не понял как полученные значения передать в переменую(ые), что бы каждому числу соответствовала своя переменная.


CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $html = file_get_contents('http://www.ganjawars.ru/info.php?id=135397');
  3. preg_match_all ("#<b>(.*)</b>#iU", $html, $regs);
  4. echo "<pre>";
  5. print_r($regs[1]);
  6.  


На выходе получаю массив:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.  
  3. (
  4.     [0] => GanjaWars.Ru
  5.     [1] => Авторизация в игре
  6. .....
  7.     [51] => 12
  8.     [52] => 20/3
  9.     [66] => 2
  10.     [67] => Информация
  11. )
  12.  
  13.  



Помогите, пожалуйся, разобратьсяУлыбка
2. Champion - 08 Марта, 2010 - 08:17:35 - перейти к сообщению
http://forum.php.su/topic.php?fo...=62&topic=30
Вот прочитаешь, всё получится)
(Добавление)
Вопрос такой: я правильно понял, что нужно просто выдрать все цифры, перед которыми нет #? Или нужно выдрать все цифры, которые встречаются в приведенных кусках html? Или что-то еще?
3. GFox - 08 Марта, 2010 - 11:57:34 - перейти к сообщению
Спасибо, почитаю и этот фак Улыбка

Оптимальным вариантом было бы сначала разбить страничку на блоки (если посмотреть ссылку то видно, там в каждом блоке свои цифры), убрать все ненужные нам блоки а из оставшихся вытащить цифры. Но я не знаю, возможно ли такое
4. movEAX - 08 Марта, 2010 - 12:49:51 - перейти к сообщению
GFox пишет:
2.2 проблема два, нужно игнорировать числа, перед которыми стоит # (#2387)

(?<!#)\d+
5. GFox - 08 Марта, 2010 - 13:32:05 - перейти к сообщению
movEAX, Спасибо большое Улыбка

правильно ли я понимаю принцип записи ?
((?<!#)\d+)(следующая претензия)(следующая претензия));
(убираем числа перед которыми стоит знак #)(\d - ищем все чила) и т.д.
6. GFox - 21 Марта, 2010 - 20:41:42 - перейти к сообщению
Вроде что-то получилось

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?
  3. $html = file_get_contents('http://www.ganjawars.ru/info.php?id=181462');
  4. echo ($html);
  5. preg_match_all ("|<font color=#990000>(\d+.+)|", $html, $vlad);
  6. preg_match_all ("|<font color=#99000><b>(.*) <font|", $html, $boevoy);
  7. preg_match_all ("|<font color=#000099><b>(.*)<font style|", $html, $eco);
  8. preg_match_all ("|<td><font color=#009900><b>(.*) <font style='font-size:8px;color:#809980'>|", $html, $proiz);
  9. preg_match_all ("|<b>(\d+.+) ]|", $html, $slvl);
  10.  
  11. echo "<pre>";
  12. print_r($vlad[0]);
  13. echo "<pre>";
  14.  
  15. print_r($boevoy[0]);
  16. echo "<pre>";
  17. print_r($slvl[0]);
  18. echo "<pre>";
  19. print_r($eco[0]);
  20. echo "<pre>";
  21. print_r($proiz[0]);
  22. ?>
  23.  


На выходе получаю:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. (
  3.     [0] => 7 (85.4)
  4.     [1] => 17 (2080.2)
  5.     [2] => 20/2 (8672.2)
  6.     [3] => 6 (64.4)
  7.     [4] => 8 (132.1)
  8.     [5] => 6 (168.2)
  9. )
  10.  
  11. (
  12.     [0] => 33 (733408)
  13.  
  14. (
  15.     [0] => 24 (114989) ]
  16. )
  17.  
  18. (
  19.     [0] => 11 (587560.66)
  20.  
  21. (
  22.     [0] => 16 (49513.15)
  23.  
  24.  


Не знаю, правильно сделал или нет, но результат, в принципе, устраивает.

Теперь несколько вопросов )
1. Можно ли получить этот результат в одном массиве за один проход?
Если я правильно понимаю алгоритм, то в моем случае происходит 5 проверок одной и той же страницы и, наверняка, увеличивается время выполнения поиска.
2. Я хочу запустить этот процесс в цикле, id ссылки будет браться из базы а результат будет записывать в базу.
Если производить такой поиск по 90-150 страничкам, это сильно будет нагружать сервер и с какой периодичностью можно это делать, что бы все не повисло? я думал так сделать:
с 6 утра до 00,00 - каждые 10-20 секунд, с 00,00 до 6 - раз в пол часа.

 

Powered by ExBB FM 1.0 RC1