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

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

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

 

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

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

тема: подскажите с preg_match_all)
 
 автор: adminn   (17.01.2010 в 11:46)   письмо автору
 
 

есть скрипт
<?php
set_time_limit
(1000);

$file file("html.txt");
 
  if(!
file)
{
      echo(
"Ошибка открытия файла");
}
      else  {

$text implode($file);
preg_match_all("|<[^>]+>(.*)</[^>]+>|U"$text$out);

for (
$i=0$icount($out[0]); $i++) {

  echo 
"<br>";
  echo 
$out[1][$i] . "\n";
 
}

}
?>

есть файл html.txt такого вида

href=http://site.ru/cgi-bin/wall/show.pl?razdel=/files/home.conf?&list=810 class=a>136</a> | <a 
href=http://site.ru/cgi-bin/wall/show.pl?razdel=/files/home.conf?&list=811 class=a>136</a> | <a 
href=http://site.ru/cgi-bin/wall/show.pl?razdel=/files/home.conf?&list=812 class=a>136</a> | <a 
href=http://site.ru/cgi-bin/wall/show.pl?razdel=/files/home.conf?&list=813 class=a>136</a> | <a 


голову сломал , подскажите как выбрать все ссылки, чтоб получить такой список
http://site.ru/cgi-bin/wall/show.pl?razdel=/files/home.conf?&list=810
http://site.ru/cgi-bin/wall/show.pl?razdel=/files/home.conf?&list=811
http://site.ru/cgi-bin/wall/show.pl?razdel=/files/home.conf?&list=812
http://site.ru/cgi-bin/wall/show.pl?razdel=/files/home.conf?&list=813
...

  Ответить  
 
 автор: ddhvvn   (17.01.2010 в 13:42)   письмо автору
 
   для: adminn   (17.01.2010 в 11:46)
 

скажите, а зачем здесь рег.выражения?
Вам хватит substr (+strpos)

  Ответить  
 
 автор: adminn   (17.01.2010 в 23:39)   письмо автору
 
   для: ddhvvn   (17.01.2010 в 13:42)
 

не получается , если я сделаю так
<?
   $text 
"href=http://site.ru/cgi-bin/wall/show.pl?razdel=/files/home.conf?&list=810 class=a>136</a> | <a  ";
   
$string substr($text5);
   echo (); 
?>

вернет как я понял
http://site.ru/cgi-bin/wall/show.pl?razdel=/files/home.conf?&list=810 class=a>136</a> | <a
а мне нужно
http://site.ru/cgi-bin/wall/show.pl?razdel=/files/home.conf?&list=810
и ссылки могут быть такие
http://site.ru/cgi-bin/wall/show.pl?razdel=/files/home.conf?&list=8
http://site.ru/cgi-bin/wall/show.pl?razdel=/files/home.conf?&list=810
т.е разной длины

подскажите как сделать , я не могу сообразить , желательно с примерами

  Ответить  
 
 автор: Diplex   (18.01.2010 в 01:11)   письмо автору
 
   для: adminn   (17.01.2010 в 23:39)
 

Если без премудростей, то так:

<?php

$text 
'href=http://site.ru/cgi-bin/wall/show.pl?razdel=/files/home.conf?&list=810 class=a>136</a> | <a  
href=http://site.ru/cgi-bin/wall/show.pl?razdel=/files/home.conf?&list=811 class=a>136</a> | <a  
href=http://site.ru/cgi-bin/wall/show.pl?razdel=/files/home.conf?&list=812 class=a>136</a> | <a  
href=http://site.ru/cgi-bin/wall/show.pl?razdel=/files/home.conf?&list=813 class=a>136</a> | <a '
;

preg_match_all("|href=(.*) class=a>136</a>|U"$text$out); 

for (
$i=0$icount($out[0]); $i++) { 
  echo 
"<br>"
  echo 
$out[1][$i] . "\n";   
}
?>

  Ответить  
 
 автор: adminn   (20.01.2010 в 03:03)   письмо автору
 
   для: Diplex   (18.01.2010 в 01:11)
 

спасибо разобрался , но проблема в то , что у меня class=a>136</a> всегда разный , т.е 136,137.... с одного до 20000

  Ответить  
 
 автор: Diplex   (20.01.2010 в 07:30)   письмо автору
 
   для: adminn   (20.01.2010 в 03:03)
 

Можно сократить это:

preg_match_all("|href=(.*) class=a>136</a>|U", $text, $out);


на это:

preg_match_all("|href=(.*) class=a>|U", $text, $out);

или это:
preg_match_all("|href=(.*) class=a>(.*)</a>|U", $text, $out);

  Ответить  
 
 автор: ddhvvn   (18.01.2010 в 13:35)   письмо автору
 
   для: adminn   (17.01.2010 в 23:39)
 

А открыть описание функций рука не поднимается?
<?php
...
$text substr($text,5);
$text substr($text0strpos($text' '));
...
?>

  Ответить  
 
 автор: adminn   (20.01.2010 в 03:16)   письмо автору
 
   для: ddhvvn   (18.01.2010 в 13:35)
 

не подойдет т.к если сохранять список и заливать его на сервер в тхт , он получается в одну строку как не крути т.е
<a href=УРЛ&list=18 class=a>4</a> | <a href=УРЛ2&list=18 class=a>5</a> .....

  Ответить  
 
 автор: Слух   (20.01.2010 в 08:43)   письмо автору
 
   для: adminn   (17.01.2010 в 11:46)
 

Непонятно только зачем читать содержимое файла функцией file сливать потом все данные в одну строку, и жаловаться что весь файл объеденён в одну строку.
Вам уже не раз ответили, но можете попробовать еще так.
<?php 
set_time_limit
(1000); 

$file file_get_contents("html.txt"); 
  
  if(!
file

      die(
"Ошибка открытия файла"); 

//Находим сам Url и текст ссылки, возможно понадобится позже
preg_match_all("|href=(.*)\s.*[^>]+>(.*)</[^>]+>|U"$file$outPREG_SET_ORDER); 

if(!isset(
$out[0][1]))
die(
'ничего подходящего не нашли');
foreach(
$out as $value)

  echo 
"Ссылка ".$value[1]." Текст ссылки ".$value[2]." \n<br/>"
  
}
 
?>

  Ответить  
 
 автор: Trianon   (20.01.2010 в 09:05)   письмо автору
 
   для: Слух   (20.01.2010 в 08:43)
 

>Непонятно только зачем читать содержимое файла функцией file сливать потом все данные в одну строку, и жаловаться что весь файл объеденён в одну строку.

implode(file()) не объединяет строки в одну.

  Ответить  
 
 автор: Слух   (20.01.2010 в 10:33)   письмо автору
 
   для: Trianon   (20.01.2010 в 09:05)
 

Мне прям стало интересно что же он тогда сделает если не объединит строки в одну?
http://ua2.php.net/manual/en/function.implode.php
http://ua2.php.net/manual/en/function.file.php

Решил все же перепроверить

<?
$body 
file_get_contents('http://softtime.ru/'); 
echo 
gettype($body)." ".strlen($body)." ".str_word_count($body)."<br>"
$body file('http://softtime.ru/'); 
echo 
gettype($body)."  ".count($body)."<br>"
$body implode($body); 
echo 
gettype($body)."  ".strlen($body)." ".str_word_count($body)."<br>";
?>

  Ответить  
 
 автор: Trianon   (20.01.2010 в 13:27)   письмо автору
 
   для: Слух   (20.01.2010 в 10:33)
 

Если под строкой понимать цепочку байт - конечно же объединит.
Если - строку текста, ограниченную разделителем строк LF, то эти разделители никуда не уберутся, и в результате окажется построчное про\едставление текста.

  Ответить  
 
 автор: Слух   (20.01.2010 в 14:05)   письмо автору
 
   для: Trianon   (20.01.2010 в 13:27)
 

Под строкой я понимаю тип переменной в php.
Придираться к словам не хорошо, вы сегодня не выспались?

  Ответить  
 
 автор: Diplex   (20.01.2010 в 14:24)   письмо автору
 
   для: Слух   (20.01.2010 в 14:05)
 

Этот "недосып" уже давно продолжается :) Жалко, что мы потеряли нашего доброго Trianon'a :)

  Ответить  
Rambler's Top100
вверх

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