|
|
|
| как из этой страницы
http://www.neverlands.ru/playerinfo.php?playername=LordOS
вот эти значения
Сила: 2
Ловкость: 1
Удача: 1
Здоровье: 8
Знания: 8
Мудрость: 1
сделать переменые, точнее нужно содрать со страницы значения и сделать их переменными?
можно вообше это реализовать? | |
|
|
|
|
|
|
|
для: 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($fd, 4096);
}
}
// Закрыть открытый указатель файла
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-кода, составление условий поиска и применение функций поиска и вырезания части текста из строковой переменной. | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(08.11.2004 в 02:30)
| | Большое спасибо | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(08.11.2004 в 02:30)
| | и еще как сделать чтоб в переменной var были только цифры? | |
|
|
|
|
|
|
|
для: Ozxar
(08.11.2004 в 03:33)
| | Допустим, число может быть и дву и трезначным.
Тогда можно использовать вот такой код
<?
$pos = strpos($text, "Сила");
$var = substr($text, $pos+71, 3);
echo $var;
?>
|
А переменную var преобразовывать в число вот так:
<?
// Допустим var содержит значение
$var="5<td";
$var = 0+$var;
echo "var=".$var;
?>
|
Будет выведено: var=5 | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(08.11.2004 в 04:04)
| | Мне предложили вот так, но как он работает я не понял?
Объясните мне, рожалуйста, его принцип работы
<?
$fname = '/playerinfo.php?playername=LordOS';
$fhost = 'www.neverlands.ru';
$x = 0;
$fp = fsockopen($fhost, 80, &$errno, &$errstr, 30) 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);
?>
|
| |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(08.11.2004 в 04:04)
| | А есть другие способы? | |
|
|
|
|
|
|
|
для: Ozxar
(09.11.2004 в 00:25)
| | Точно можно вырезать при помощи регулярных выражений
<?php
preg_match("|Сила:<[^<]*<[^<]*<[^<]*<[^>]*> ([\d]+)|i",$bufer,$matches);
echo "Сила - ".$matches[1]."<br>";
preg_match("|Ловкость:<[^<]*<[^<]*<[^<]*<[^>]*> ([\d]+)|i",$bufer,$matches);
echo "Ловкость - ".$matches[1]."<br>";
preg_match("|Удача:<[^<]*<[^<]*<[^<]*<[^>]*> ([\d]+)|i",$bufer,$matches);
echo "Удача - ".$matches[1]."<br>";
preg_match("|Здоровье:<[^<]*<[^<]*<[^<]*<[^>]*> ([\d]+)|i",$bufer,$matches);
echo "Здоровье - ".$matches[1]."<br>";
preg_match("|Знания:<[^<]*<[^<]*<[^<]*<[^>]*> ([\d]+)|i",$bufer,$matches);
echo "Знания - ".$matches[1]."<br>";
preg_match("|Мудрость:<[^<]*<[^<]*<[^<]*<[^>]*> ([\d]+)|i",$bufer,$matches);
echo "Мудрость - ".$matches[1]."<br>";
?>
|
Содержимое страницы должно быть в $bufer. | |
|
|
|
|
|
|
|
для: cheops
(09.11.2004 в 00:45)
| | а как добавить к ним сравнение
вот например есть переменные $a=4 и $b=6 как проверить чначение если ети значения больше $matches[1] то $matches[1] меняла цвет на красный а если меньше то обычный цвет | |
|
|
|
|
|
|
|
для: Ozxar
(09.11.2004 в 20:31)
| | Хм... ну так и проверить
<?php
if( $matches[1]>6) echo "<font color=red>".$matches[1]."</font>";
else echo $matches[1];
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(09.11.2004 в 00:45)
| | это прикольно а как вот этой сылки
http://www.neverlands.ru/playerinfo.php?playername=Ljeka
содрать
Знания: 16 (1+15)
не значение 16 а 1 | |
|
|
|
|
|
|
|
для: Ozxar
(15.11.2004 в 00:06)
| |
<?php
preg_match("|Сила:<[^<]*<[^<]*<[^<]*<[^>]*> ([\d]+)[^\(]*\(([\d]+)[^>]*>([\d]+)|i",$bufer,$matches);
echo "Сила - ".$matches[1]."<br>";
echo "Сила (первая цифра в скобках) - ".$matches[2]."<br>";
echo "Сила (вторая цифра в скобках) - ".$matches[3]."<br>";
?>
|
PS Самому на это регулярное выражение смотреть страшно :))) | |
|
|
|
|
|
|
|
для: cheops
(15.11.2004 в 01:14)
| | А можно сделать проверку, если 2 и 3 числа нет то выводим 1
я верно понимаю, так удобнее | |
|
|
|
|
|
|
|
для: Ozxar
(15.11.2004 в 03:18)
| | Действительно не совсем удачное регулярное выражение, так как если чисел в скобках нет, они подцеляются от следующего числа. Для того, чтобы получить получать числа и в скобках и вне их следует исправить и объединить оба регулярных выражения:
<?php
$patern = "#Здоровье:<[^<]*<[^<]*<[^<]*<[^>]*> ([\d]+)[^>]*> \(([\d]+)[^>]*>([\d]+)|Здоровье:<[^<]*<[^<]*<[^<]*<[^>]*> ([\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>";
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(09.11.2004 в 00:45)
| | preg_match("|Сила:<[^<]*<[^<]*<[^<]*<[^>]*> ([\d]+)|i",$bufer,$matches);
Поясните пожалуста как работает она | |
|
|
|
|
|
|
|
для: Ozxar
(27.11.2004 в 22:39)
| |
<tr><td bgcolor=#FCFAF3><font class=nickname> Здоровье:</td><td width=100% bgcolor=#fafafa><font class=nickname><b> 25</b></td></tr>
|
Всё, что в скобках [] обозначает один символ, в данном случае [^<] - любой симовол кроме < (здесь ^ - это отрицание), [\d] - это любая цифра 0-9, но одна. * - любое число символов перед ней, таким образом [^<]* - любое число символов кроме < - таких символов как раз между словом "Сила" и числом 4 штуки, потом просто передираем неразрывный пробел - , а в скобках число одно или больше (+) - ([\d]+). Скобки в регулярных выражениях имеют особое значение, если в $matches[0] попадает строка соотвествующая всему регулярному выражению, то в $matches[1] поподает содержимое первых скобок, в $matches[2] - вторых и т.д. Поэтому, искомое число у нас попадает в элемент $matches[1], так как у нас используются одни скобки.
http://www.softtime.ru/dic/id_dic=134&id_group=3 | |
|
|
|
|
|
|
|
для: cheops
(27.11.2004 в 23:17)
| | Хм у меня не получилось
<b>DnBass</b> [2]
нужно получть значение в скобка []
Вот мой код
preg_match("|$data->never<[^<]*[([\d]+)|i",$bufer,$matches);
в место DnBass должна быть переменная $data->never.
Так можно? | |
|
|
|
|
|
|
|
для: Ozxar
(28.11.2004 в 05:25)
| | Хм... не очень понимаю почему используется переменная $data->never? Вы ищете в исходном скрипте или в результатах его выполнения?
для <b>DnBass</b> [2]
нужно получть значение в скобка []
Как раз разумнее использовать следующее выражение
<?php
preg_match("|DnBass<[^<]*\[([\d]+)|i",$bufer,$matches);
?>
|
Т.е. отталкиваемся от DnBass, при этом если в тексте встречаются квадратные скобки - не забываем их экранировать, так как без экранирования они воспринимаются как начала класса символов вроде [\d]. | |
|
|
|
|
|
|
|
для: cheops
(28.11.2004 в 14:21)
| | в результатах его выполнения
вот например
http://www.neverlands.ru/playerinfo.php?playername=DnBass
вместо Dnbass должна быть переменная и значит будет другое имя.
и еще preg_match можно будет выберать не число а текст | |
|
|
|
|
|
|
|
для: 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);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(28.11.2004 в 20:40)
| | у меня почемуто 0 показывает | |
|
|
|
|
|
|
|
для: Ozxar
(28.11.2004 в 22:23)
| | URL на страницу приведите - может там какие-нибудь подводные камни... | |
|
|
|
|
|
|
|
для: cheops
(28.11.2004 в 22:27)
| | http://www.neverlands.ru/playerinfo.php?playername=LordOS
http://www.neverlands.ru/playerinfo.php?playername=concord | |
|
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: Маша
(29.12.2004 в 06:40)
| | Хм... а где исполняется скрипт на хостинге? Может быть запрещено открытие файла с удалённой машины в целях экономии входящего трафика. Попробуйте выполнить этот скрипт на локальной хосте.
PS Только добавьте вывод результата echo $text. | |
|
|
|
|
|
|
|
для: cheops
(29.12.2004 в 08:25)
| | я так понимаю должна быть включена опция allow_url_fopen .. она включена.. хостинг H14 .. если обращаться к файлам расположенм в той же директории что и скрипт, то все работает.. | |
|
|
|
|
|
|
|
для: Маша
(29.12.2004 в 08:35)
| | Хм... если бы директива была отключена в окно браузера вываливалось что-то вроде
URL file-access is disabled in the server configuration
|
У нас же сообщается, что не достаточно прав для совершения операции... чёрт знает что такое, может админы чего намудрили с настройками... Попробуйте написать им письмо - у них всех ведь средства под рукой для решения проблемы. | |
|
|
|