PHP в вопросах и ответах. Часть II.
Автор: Дмитрий Бородин
Источник: php.spb.ru
Вопрос: Как вырезать со страницы все ссылки?
Ответ.
<?
echo "<pre>";
// качаем страницу в переменную $buf
$buf=implode("",file("http://www.ru/"));
// получем ссылки в массив
preg_match_all("/<[Aa][ \r\n\t]{1}[^>]*[Hh][Rr][Ee][Ff][^=]*=[ '\"\n\r\t]*([^ \"'>\r\n\t#]+)[^>]*>/",$buf,$url);
// выводим массив на экран
while($i<count($url[1])) { echo $url[1][$i++]."\n"; }
echo "</pre>";
?>
Вопрос: Как вытащить слова из текста?
Ответ. Слово - непрерывная последовательность символов. Используем это в нашем скрипте.
<?php
$x="Типа, %^& читайте___люди~~~~__маны__ На... РУССКОМ!! Будете+здоровы. abc, qwe, zxc";
preg_match_all('/([a-zA-Zа-яА-Я]+)/',$x,$ok);
for ($i=0; $i<count($ok[1]); $i++) echo $ok[1][$i]."<br>";
?>
Типа
читайте
люди
маны
На
РУССКОМ
Будете
здоровы
abc
qwe
zxc
Ответ: (Решение)
<?php
$buf="
http://любые слова
sadkjfjkas dfkjasdf ajksd fjkdsfh jksdf kasjdfh kjdfjksdaf
asfdasd.fklja sdfk.jaas kasldf.jaskldjfls.kadjfkls.dfjaklsdf
1 www1.ru
2 www2.ru/123/123
3 SOFTPORTAL.COM
4 www.softportal.com
5 www.123.456.ru/1234/asd#tip-top
6 http://www.ru
7 http://www.ru/123/123
8 http://softportal.com
9 http://www.softportal.com
10 HTTP://www.download.softportal.com (скачать новую Асю :-)
11 dmitry.spb.ru
BAD
BAD234579324875.12312
BAD.q
www.BAD.rrrr
www.BAD.123
";
echo "<big><b>Имеется текст:</b></big> <pre>$buf</pre>";
// 1 //
$buf=strtolower($buf);
preg_match_all("/(http:\\/\\/)?([a-z_0-9-.]+\\.[a-z]{2,3}(([ \"'>\r\n\t])|(\\/([^ \"'>\r\n\t]*)?)))/",$buf,$url);
echo "<big><b><br><br>Часть 1. В тексте было найдено:</b></big><pre>";
for($i=0; $i<count($url[2]); $i++)
echo "<a href="javascript:if(confirm('http://".$url[2][$i]."/ \n\nThis file was not retrieved by Teleport Pro, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?'))window.location='http://".$url[2][$i]."/'" tppabs="http://".$url[2][$i]."/">".$url[2][$i]."</a>\n";
echo "</pre>";
// 2 //
echo "<big><b><br><br>Часть 2. Замена текста-ссылки на html-код прямо в тексте:</b></big><pre>";
$x=explode(" ",$buf);
for ($j=0; $j<count($x); $j++) {
if (preg_match("/(http:\\/\\/)?([a-z_0-9-.]+\\.[a-z]{2,3}(([ \"'>\r\n\t])|(\\/([^ \"'>\r\n\t]*)?)))/",$x[$j],$ok))
echo str_replace($ok[2],"<a href="javascript:if(confirm('http://$ok[2]/ \n\nThis file was not retrieved by Teleport Pro, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?'))window.location='http://$ok[2]/'" tppabs="http://$ok[2]/">$ok[2]</a>",
str_replace("http://","",$x[$j]))." ";
else
echo $x[$j]." ";
}
?>
P.S. почему www1.ru не превратилась в ссылку? Попытайтесь найти ответ на этот вопрос сами...
Ответ.Чтобы это сделать, нужно открыть сокет (установить соединение с удаленным веб-сервером). Сокет - это файл, в который можно писать и читать. Далее в сокет (как в файл) нужно написать заголовок (HEAD filename ...). После считать из сокета то, что нам напишут. Для начала выведите это на экран, чтобы было понятно, что именно вам возвращают. В ответе сервера, что мы считаем, будет много полезной информации - тип и ОС сервера, дата модификации и размер файла, другая информации. Все, что нужно - выкусить из текста нужное число и вывести его на экран.
<?php
$fname='/path-to-file/big-big-big.mpg';
$fhost='www.super-mega.ru';
$x=0;
$fp = fsockopen($fhost, 80, &$errno, &$errstr, 30) or die("облом");
fputs($fp,"HEAD $fname HTTP/1.0\nHOST: $fhost\n\n");
while(!feof($fp)) $x.=fgets($fp,128);
fclose($fp);
if (ereg(<"Content-Length: ([0-9]+)",$x,$size)) echo "Размер файла $size[1] байт";
else echo "Определить невозможно";
?>