Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: как содрать со страницы данные?
 
 автор: Ozxar   (08.11.2004 в 01:49)   письмо автору
 
 

как из этой страницы
http://www.neverlands.ru/playerinfo.php?playername=LordOS
вот эти значения
Сила: 2
Ловкость: 1
Удача: 1
Здоровье: 8
Знания: 8
Мудрость: 1
сделать переменые, точнее нужно содрать со страницы значения и сделать их переменными?
можно вообше это реализовать?

   
 
 автор: glsv (Дизайнер)   (08.11.2004 в 02:30)   письмо автору
 
   для: Ozxar   (08.11.2004 в 01:49)
 

Это чужая страница? Я имею ввиду Вы не имеете доступа к исходным кодам страницы?

Тогда поступаем так.

Первым делом читаем файл в переменную

<?
  $link 
"http://www.neverlands.ru/playerinfo.php?playername=LordOS";
  
$fd fopen($link"r");
  
$text="";              
  if (!
$fd) echo "Запрашиваемая страница не найдена";
  else
  {
    
// Чтение содержимого файла в переменную text
    
while (!feof ($fd))
    {
      
$text .= fgets($fd4096);
    }
  }
  
// Закрыть открытый указатель файла
  
fclose ($fd);   
?>


Далее в помощью строковой функции ищем нужный нам текст. Для того чтобы это сделать необходимо проанализировать исходный HTML-код страницы.
Сделаем на примере параметра Сила

Сила:</td><td width=100% bgcolor=#fafafa><font class=nickname><b> 2</b>

Это нужный участок кода HTML
Итого нужный нам параметр отстоит от слова "Сила" на 71 символ.
Пишем такой код.

  $pos = strpos($text, "Сила");
  $var = substr($text, $pos+71, 1);
  echo $var;


Вот и все - в переменной var находится значение силы.

Можно использовать регулярные выражения для поиска, осуществлять разного рода проверки, число может быть двузначным..., но в целом алгоритм таков:
анализ HTML-кода, составление условий поиска и применение функций поиска и вырезания части текста из строковой переменной.

   
 
 автор: Ozxar   (08.11.2004 в 02:51)   письмо автору
 
   для: glsv (Дизайнер)   (08.11.2004 в 02:30)
 

Большое спасибо

   
 
 автор: Ozxar   (08.11.2004 в 03:33)   письмо автору
 
   для: glsv (Дизайнер)   (08.11.2004 в 02:30)
 

и еще как сделать чтоб в переменной var были только цифры?

   
 
 автор: glsv (Дизайнер)   (08.11.2004 в 04:04)   письмо автору
 
   для: Ozxar   (08.11.2004 в 03:33)
 

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


<?
  $pos 
strpos($text"Сила"); 
  
$var substr($text$pos+713); 
  echo 
$var;
?>


А переменную var преобразовывать в число вот так:

<?
  
// Допустим var содержит значение
  
$var="5<td";
  
$var 0+$var;
  echo 
"var=".$var;
?>

Будет выведено: var=5

   
 
 автор: Ozxar   (08.11.2004 в 13:55)   письмо автору
 
   для: glsv (Дизайнер)   (08.11.2004 в 04:04)
 

Мне предложили вот так, но как он работает я не понял?
Объясните мне, рожалуйста, его принцип работы
<? 

$fname 
'/playerinfo.php?playername=LordOS'
$fhost =  'www.neverlands.ru'

$x 0
$fp fsockopen($fhost80, &$errno, &$errstr30) or die("could not connect"); 

fputs($fp,"HEAD $fname HTTP/1.0\nHOST: $fhost\n\n"); 
while (!
feof($fp)) $x .= fgets($fp,128); 
fclose($fp); 
?>

   
 
 автор: cheops   (08.11.2004 в 14:48)   письмо автору
 
   для: Ozxar   (08.11.2004 в 13:55)
 

Все действия функций, работающих с удалённым хостом основаны на сокетах - на самом деле приведённый выше код, тоже упрощённый вариант - самый полный смотрите во втором посте по ссылке - в основе удалённой версии fopen и fsockopen лежит один механизм.
Здесь организуется соединение по 80 порту (HTTP) с хостом www.neverlands.ru - ему в ручную отправляются HTTP-заголовки ("HEAD $fname HTTP/1.0\nHOST: $fhost\n\n") в ответ на которые сервер отсылает HTML-страницу. Точно так же поступают Web-браузеры при просмотре Web-страниц.

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=600

   
 
 автор: Ozxar   (09.11.2004 в 00:25)   письмо автору
 
   для: glsv (Дизайнер)   (08.11.2004 в 04:04)
 

А есть другие способы?

   
 
 автор: cheops   (09.11.2004 в 00:45)   письмо автору
 
   для: Ozxar   (09.11.2004 в 00:25)
 

Точно можно вырезать при помощи регулярных выражений
<?php
  preg_match
("|Сила:<[^<]*<[^<]*<[^<]*<[^>]*>&nbsp;([\d]+)|i",$bufer,$matches);
  echo 
"Сила - ".$matches[1]."<br>";
  
preg_match("|Ловкость:<[^<]*<[^<]*<[^<]*<[^>]*>&nbsp;([\d]+)|i",$bufer,$matches);
  echo 
"Ловкость - ".$matches[1]."<br>";
  
preg_match("|Удача:<[^<]*<[^<]*<[^<]*<[^>]*>&nbsp;([\d]+)|i",$bufer,$matches);
  echo 
"Удача - ".$matches[1]."<br>";
  
preg_match("|Здоровье:<[^<]*<[^<]*<[^<]*<[^>]*>&nbsp;([\d]+)|i",$bufer,$matches);
  echo 
"Здоровье - ".$matches[1]."<br>";
  
preg_match("|Знания:<[^<]*<[^<]*<[^<]*<[^>]*>&nbsp;([\d]+)|i",$bufer,$matches);
  echo 
"Знания - ".$matches[1]."<br>";
  
preg_match("|Мудрость:<[^<]*<[^<]*<[^<]*<[^>]*>&nbsp;([\d]+)|i",$bufer,$matches);
  echo 
"Мудрость - ".$matches[1]."<br>";
?>

Содержимое страницы должно быть в $bufer.

   
 
 автор: Ozxar   (09.11.2004 в 20:31)   письмо автору
 
   для: cheops   (09.11.2004 в 00:45)
 

а как добавить к ним сравнение
вот например есть переменные $a=4 и $b=6 как проверить чначение если ети значения больше $matches[1] то $matches[1] меняла цвет на красный а если меньше то обычный цвет

   
 
 автор: cheops   (09.11.2004 в 20:54)   письмо автору
 
   для: Ozxar   (09.11.2004 в 20:31)
 

Хм... ну так и проверить
<?php
  
if( $matches[1]>6) echo "<font color=red>".$matches[1]."</font>";
  else echo 
$matches[1];
?>

   
 
 автор: Ozxar   (15.11.2004 в 00:06)   письмо автору
 
   для: cheops   (09.11.2004 в 00:45)
 

это прикольно а как вот этой сылки
http://www.neverlands.ru/playerinfo.php?playername=Ljeka
содрать
Знания: 16 (1+15)
не значение 16 а 1

   
 
 автор: cheops   (15.11.2004 в 01:14)   письмо автору
 
   для: Ozxar   (15.11.2004 в 00:06)
 

<?php
  preg_match
("|Сила:<[^<]*<[^<]*<[^<]*<[^>]*>&nbsp;([\d]+)[^\(]*\(([\d]+)[^>]*>([\d]+)|i",$bufer,$matches); 
  echo 
"Сила - ".$matches[1]."<br>"
  echo 
"Сила (первая цифра в скобках) - ".$matches[2]."<br>"
  echo 
"Сила (вторая цифра в скобках) - ".$matches[3]."<br>"
?>


PS Самому на это регулярное выражение смотреть страшно :)))

   
 
 автор: Ozxar   (15.11.2004 в 03:18)   письмо автору
 
   для: cheops   (15.11.2004 в 01:14)
 

А можно сделать проверку, если 2 и 3 числа нет то выводим 1
я верно понимаю, так удобнее

   
 
 автор: cheops   (15.11.2004 в 12:03)   письмо автору
 
   для: Ozxar   (15.11.2004 в 03:18)
 

Действительно не совсем удачное регулярное выражение, так как если чисел в скобках нет, они подцеляются от следующего числа. Для того, чтобы получить получать числа и в скобках и вне их следует исправить и объединить оба регулярных выражения:
<?php
  $patern 
"#Здоровье:<[^<]*<[^<]*<[^<]*<[^>]*>&nbsp;([\d]+)[^>]*> \(([\d]+)[^>]*>([\d]+)|Здоровье:<[^<]*<[^<]*<[^<]*<[^>]*>&nbsp;([\d]+)#i";
  
preg_match($patern,$bufer,$matches); 
  if(empty(
$matches[4]))
  {
    echo 
"Здоровье - ".$matches[1]."<br>"
    echo 
"Здоровье (первая цифра в скобках) - ".$matches[2]."<br>"
    echo 
"Здоровье (вторая цифра в скобках) - ".$matches[3]."<br>"
  }
  else
  {
    echo 
"Здоровье - ".$matches[4]."<br>"
  }
?>

   
 
 автор: Ozxar   (27.11.2004 в 22:39)   письмо автору
 
   для: cheops   (09.11.2004 в 00:45)
 

preg_match("|Сила:<[^<]*<[^<]*<[^<]*<[^>]*>&nbsp;([\d]+)|i",$bufer,$matches);
Поясните пожалуста как работает она

   
 
 автор: cheops   (27.11.2004 в 23:17)   письмо автору
 
   для: Ozxar   (27.11.2004 в 22:39)
 

<tr><td bgcolor=#FCFAF3><font class=nickname>&nbsp;Здоровье:</td><td width=100% bgcolor=#fafafa><font class=nickname><b>&nbsp;25</b></td></tr>

Всё, что в скобках [] обозначает один символ, в данном случае [^<] - любой симовол кроме < (здесь ^ - это отрицание), [\d] - это любая цифра 0-9, но одна. * - любое число символов перед ней, таким образом [^<]* - любое число символов кроме < - таких символов как раз между словом "Сила" и числом 4 штуки, потом просто передираем неразрывный пробел - &nbsp;, а в скобках число одно или больше (+) - ([\d]+). Скобки в регулярных выражениях имеют особое значение, если в $matches[0] попадает строка соотвествующая всему регулярному выражению, то в $matches[1] поподает содержимое первых скобок, в $matches[2] - вторых и т.д. Поэтому, искомое число у нас попадает в элемент $matches[1], так как у нас используются одни скобки.

http://www.softtime.ru/dic/id_dic=134&id_group=3

   
 
 автор: Ozxar   (28.11.2004 в 05:25)   письмо автору
 
   для: cheops   (27.11.2004 в 23:17)
 

Хм у меня не получилось
<b>DnBass</b> [2]
нужно получть значение в скобка []
Вот мой код
preg_match("|$data->never<[^<]*[([\d]+)|i",$bufer,$matches);
в место DnBass должна быть переменная $data->never.
Так можно?

   
 
 автор: cheops   (28.11.2004 в 14:21)   письмо автору
 
   для: Ozxar   (28.11.2004 в 05:25)
 

Хм... не очень понимаю почему используется переменная $data->never? Вы ищете в исходном скрипте или в результатах его выполнения?
для <b>DnBass</b> [2]
нужно получть значение в скобка []
Как раз разумнее использовать следующее выражение
<?php
  preg_match
("|DnBass<[^<]*\[([\d]+)|i",$bufer,$matches);
?>

Т.е. отталкиваемся от DnBass, при этом если в тексте встречаются квадратные скобки - не забываем их экранировать, так как без экранирования они воспринимаются как начала класса символов вроде [\d].

   
 
 автор: Ozxar   (28.11.2004 в 19:33)   письмо автору
 
   для: cheops   (28.11.2004 в 14:21)
 

в результатах его выполнения
вот например
http://www.neverlands.ru/playerinfo.php?playername=DnBass
вместо Dnbass должна быть переменная и значит будет другое имя.

и еще preg_match можно будет выберать не число а текст

   
 
 автор: cheops   (28.11.2004 в 20:40)   письмо автору
 
   для: Ozxar   (28.11.2004 в 19:33)
 

А ну тогда следует поступить следующим образом
<?php 
  preg_match
("|".($data->never)."<[^<]*\[([\d]+)|i",$bufer,$matches); 
?>

А для текста вместо [\d] следует использовать [\w]:
<?php 
  preg_match
("|".($data->never)."<[^<]*\[([\w]+)|i",$bufer,$matches); 
?>

   
 
 автор: Ozxar   (28.11.2004 в 22:23)   письмо автору
 
   для: cheops   (28.11.2004 в 20:40)
 

у меня почемуто 0 показывает

   
 
 автор: cheops   (28.11.2004 в 22:27)   письмо автору
 
   для: Ozxar   (28.11.2004 в 22:23)
 

URL на страницу приведите - может там какие-нибудь подводные камни...

   
 
 автор: Ozxar   (28.11.2004 в 22:43)   письмо автору
 
   для: cheops   (28.11.2004 в 22:27)
 

http://www.neverlands.ru/playerinfo.php?playername=LordOS
http://www.neverlands.ru/playerinfo.php?playername=concord

   
 
 автор: cheops   (29.11.2004 в 00:39)   письмо автору
 
   для: Ozxar   (28.11.2004 в 22:43)
 

Вынес обсуждение в новую тему...

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=926

   
 
 автор: Маша   (29.12.2004 в 06:40)   письмо автору
 
   для: glsv (Дизайнер)   (08.11.2004 в 02:30)
 

кто-н может объяснить почему у меня этот скрипт не работает.. пишет вот что

Warning: fopen(http://www.neverlands.ru/playerinfo.php?playername=LordOS): failed to open stream: Permission denied

Warning: fclose(): supplied argument is not a valid stream resource in

   
 
 автор: cheops   (29.12.2004 в 08:25)   письмо автору
 
   для: Маша   (29.12.2004 в 06:40)
 

Хм... а где исполняется скрипт на хостинге? Может быть запрещено открытие файла с удалённой машины в целях экономии входящего трафика. Попробуйте выполнить этот скрипт на локальной хосте.

PS Только добавьте вывод результата echo $text.

   
 
 автор: Маша   (29.12.2004 в 08:35)   письмо автору
 
   для: cheops   (29.12.2004 в 08:25)
 

я так понимаю должна быть включена опция allow_url_fopen .. она включена.. хостинг H14 .. если обращаться к файлам расположенм в той же директории что и скрипт, то все работает..

   
 
 автор: cheops   (29.12.2004 в 08:46)   письмо автору
 
   для: Маша   (29.12.2004 в 08:35)
 

Хм... если бы директива была отключена в окно браузера вываливалось что-то вроде
URL file-access is disabled in the server configuration

У нас же сообщается, что не достаточно прав для совершения операции... чёрт знает что такое, может админы чего намудрили с настройками... Попробуйте написать им письмо - у них всех ведь средства под рукой для решения проблемы.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования