BVIsoft.com - документация, статьи и примеры по PHP. [Назад]

PHP в вопросах и ответах. Часть II.[Печать]
Разместил: admin . Раздел: Для начинающих. Опубликовано: 07-25-2007 22:32:49

Продолжаем отвечать на вопросы, возникающие при программировании на PHP.

Вопрос: Как вырезать со страницы все ссылки?

Ответ.
<? 
   echo "<pre>";

   // качаем страницу в переменную $buf
   $buf=implode("",file("http://www.ru/")); 

   // получем ссылки в массив
   preg_match_all("/<[Aa][ ]{1}[^>]*[Hh][Rr][Ee][Ff][^=]*=[ '" ]*([^ "'> #]+)[^>]*>/",$buf,$url); 

   // выводим массив на экран
   while($i<count($url[1])) { echo $url[1][$i++]." "; }

   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

Вопрос: Есть некий текст, в котором встречаются фразы типа "А не пойти ли тебе на http://softportal.com ?". Нужно сделать все слова, похожие на ссылки, html-ссылками, т.е. преобразовать текст примерно так: "А не пойти ли тебе на <a href=http://softportal.com>http://softportal.com ?</a>".

Ответ.(Решение)
<?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}(([ "'> ])|(\/([^ "'> ]*)?)))/",$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]."/  This file was not retrieved by Teleport Pro, because it is addressed on a domain or path outside the boundaries set for its Starting Address.  Do you want to open it from the server?'))window.location='http://".$url[2][$i]."/'" tppabs="http://".$url[2][$i]."/">".$url[2][$i]."</a> ";
   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}(([ "'> ])|(\/([^ "'> ]*)?)))/",$x[$j],$ok))
      echo str_replace($ok[2],"<a href="javascript:if(confirm('http://$ok[2]/  This file was not retrieved by Teleport Pro, because it is addressed on a domain or path outside the boundaries set for its Starting Address.  Do 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 HOST: $fhost ");
while(!feof($fp)) $x.=fgets($fp,128);
fclose($fp);

if (ereg("Content-Length: ([0-9]+)",$x,$size)) echo "Размер файла $size[1] байт";
else echo "Определить невозможно";
?>

Источник: http://www.softportal.com/   Прочитана 896 раз.