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

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

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

 

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

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

тема: Новости с чyжого сайта
 
 автор: sidPR   (23.05.2007 в 19:41)   письмо автору
 
 

К примеру хочю сделать отдельную табличку на главной где новости за неделю с определенного мною сайта грузились но там нету к примеру RSS ленты... как быть без регулярки не обойтись? тоесть придтся конектиться к хосту и по регулярному выражению из тего выдерать нужные мне элементы?

Подскажите как лучше , как удобнее, чтобы велосипед не изобретать?

   
 
 автор: kasmanaft   (23.05.2007 в 19:49)   письмо автору
 
   для: sidPR   (23.05.2007 в 19:41)
 

Да, всё правильно. Можно попробовать без регулярных выражений обойтись, но не факт что так будет проще, скорее наоборот.

>> придется конектиться к хосту и из него выдирать нужные мне элементы?
Вам нужно получить код страницы, которую собрались граббить. А потом уже из этого кода выбирать нужные элементы... придираемся к словам)

   
 
 автор: Trianon   (23.05.2007 в 21:28)   письмо автору
 
   для: sidPR   (23.05.2007 в 19:41)
 

Потребовать от администрации сайта создать RSS-канал. И Вам легче. И клиентам польза.

   
 
 автор: mr Bin   (23.05.2007 в 21:40)   письмо автору
 
   для: Trianon   (23.05.2007 в 21:28)
 

"Потребовать" уж слово какое-то неблагозвучное..

   
 
 автор: Trianon   (23.05.2007 в 22:42)   письмо автору
 
   для: mr Bin   (23.05.2007 в 21:40)
 

Мне нужно было смайл поставить?

   
 
 автор: mr Bin   (23.05.2007 в 22:45)   письмо автору
 
   для: Trianon   (23.05.2007 в 22:42)
 

Да :) Было бы понятнее :)

   
 
 автор: sidPR   (01.06.2007 в 14:48)   письмо автору
 
   для: mr Bin   (23.05.2007 в 22:45)
 

а можно посматреть простенький пример вывода новостей с другого хоста без rss ?

   
 
 автор: sidPR   (08.06.2007 в 16:10)   письмо автору
 
   для: sidPR   (01.06.2007 в 14:48)
 

как мне сграбить инфу к примеру в середины страници есть таблица


<table cellspacing=2 cellpadding=0 class=black12>
//сдесь ифна которая мне нужна!
</table>


подскажите пожалуйста?

   
 
 автор: kasmanaft   (08.06.2007 в 17:38)   письмо автору
 
   для: sidPR   (08.06.2007 в 16:10)
 


<?php
$text 
"<table cellspacing=2 cellpadding=0 class=black12> 
//сдесь ифна которая мне нужна! 
</table>"
;
preg_match("#<table cellspacing=2 cellpadding=0 class=black12>(.*)</table>#s"$text$regs);
echo 
$regs[1];
?>

Внутри этой таблицы есть другие таблицы?
Если нет, замените (.*) на (.*?)

   
 
 автор: sidPR   (08.06.2007 в 19:24)   письмо автору
 
   для: kasmanaft   (08.06.2007 в 17:38)
 

Спасибо , а если


<table cellspacing=2 cellpadding=0 class=black12>  
<tr><td></td><td></td></tr>
<tr>
//сдесь ифна которая мне нужна!  
</tr>
</table> 

   
 
 автор: kasmanaft   (08.06.2007 в 20:12)   письмо автору
 
   для: sidPR   (08.06.2007 в 19:24)
 

Просто добавляйте эти строки "откуда" и "докуда" в рег. выражение... перенос строки - \s (вообще-то любой пробельный символ), если он может быть (а может и не быть), можно использовать \s?, если может быть несколько переносов строки - \s*

   
 
 автор: sidPR   (08.06.2007 в 20:18)   письмо автору
 
   для: kasmanaft   (08.06.2007 в 20:12)
 

непонял что куда добовлять ?

в первой верхней ячейки <TR>сдесь может быть все что угодно</tR> мне ненужно ничего извлекать мне нужно только из второй как я это покажу ?

   
 
 автор: kasmanaft   (08.06.2007 в 20:28)   письмо автору
 
   для: sidPR   (08.06.2007 в 20:18)
 

"все, что угодно" описать точнее, чем .* не получится. Показали бы полностью страницу и что из нее нужно выдернуть, было бы проще...

попробуйте вот так:

<table cellspacing=2 cellpadding=0 class=black12>\s*<tr>.*?</tr>\s*<tr>(.*)</tr>\s*</table>

   
 
 автор: sidPR   (08.06.2007 в 20:36)   письмо автору
 
   для: kasmanaft   (08.06.2007 в 20:28)
 

Да спасибо классно я ток не воткну как он определяют что мне нужно а что нет всмысле то что записывается в $regs[1]

   
 
 автор: kasmanaft   (08.06.2007 в 20:59)   письмо автору
 
   для: sidPR   (08.06.2007 в 20:36)
 

Там находится то, что попадает в скобки в рег. выражении.
$regs[0] - вся строка, попавшая под рег. выражение
$regs[1] - первая скобка (и единственная тут)
$regs[2] - вторая скобка (если бы была)
и т. д.

   
 
 автор: sidPR   (08.06.2007 в 23:29)   письмо автору
 
   для: kasmanaft   (08.06.2007 в 20:59)
 

понял, а если я хочю из данных в массив данные перегнать к примеру
тотже вариант


<table cellspacing=2 cellpadding=0 class=black12>
<tr>//тут заголовки колонок</tr>
<tr>
   <td>вода</td>
   <td>2литра</td>
   <td>производитель питер :)</td>
   <td>есть в наличии</td>
</tr>
<tr>
   <td>Квас</td>
   <td>2литра</td>
   <td>производитель Томск :)</td>
   <td>есть в наличии</td>
</tr>
</table>


вот такого рода подскажите пожалуйста как разбрасать такую инфу в массив в помощью регулярки ?

Заранее благодарю

   
 
 автор: Disable   (09.06.2007 в 00:38)   письмо автору
 
   для: sidPR   (08.06.2007 в 23:29)
 


<?php
$string
='<table cellspacing=2 cellpadding=0 class=black12>
<tr><td>жидкость</td><td>объём</td><td>производитель</td><td>наличие</td></tr> 
<tr> 
   <td>вода</td> 
   <td>2литра</td> 
   <td>производитель питер :)</td> 
   <td>есть в наличии</td> 
</tr> 
<tr> 
   <td>Квас</td> 
   <td>2литра</td> 
   <td>производитель Томск :)</td> 
   <td>есть в наличии</td> 
</tr> 
</table>'
;

$arr=$result=array();

preg_match_all('|<td>(.+)</td>|sU',$string,$arr);
print_r($arr);



$result=array_chunk($arr[1],4);
print_r($result);
?>

   
 
 автор: sidPR   (09.06.2007 в 14:52)   письмо автору
 
   для: Disable   (09.06.2007 в 00:38)
 

проблема в том что шапка как раз не нужна :( tr><td>жидкость</td><td>объём</td><td>производитель</td><td>наличие</td></tr>

а все остальное надо в массив запихать ..

   
 
 автор: Disable   (09.06.2007 в 15:05)   письмо автору
 
   для: sidPR   (09.06.2007 в 14:52)
 

Посмотрите структуру полученного массива повнимательней, или напишите массив как должно быть

   
 
 автор: sidPR   (09.06.2007 в 15:20)   письмо автору
 
   для: Disable   (09.06.2007 в 15:05)
 

хорошо вроде разобрался , а <td align=center>25.02.2003</td> если в <td > встречаетсяя чтото он не обрабатывает что нужно вставить ?

   
 
 автор: Disable   (09.06.2007 в 15:37)   письмо автору
 
   для: sidPR   (09.06.2007 в 15:20)
 

preg_match_all('|<td[^>]*>(.+)</td>|sU',$string,$arr);

   
 
 автор: sidPR   (09.06.2007 в 15:41)   письмо автору
 
   для: Disable   (09.06.2007 в 15:37)
 

Че вообще все поехало :(

   
 
 автор: sidPR   (09.06.2007 в 15:46)   письмо автору
 
   для: sidPR   (09.06.2007 в 15:41)
 

вот с чем вожусь

 <table cellspacing=2 cellpadding=4 class=black12 border="3">
<tr>
    <td><a class=lb href='/uk/126'>МТП</a></td>
    <td>ЗАО "У тпс мтп"</td>
    <td align=center>22.02.2003</td>
    <td align=center></td><td>адрес</td>
    <td align=left>134-1340314</td><td></td><td align=center>Нет</td>
        <tr>
            <td colspan="8" bgcolor=#CCCCCC><img width=1 height=1 alt=""></td>
        </tr>
        <tr>
            <td><a class=lb href='/uk/387'>ЫЫвввы</a></td>
            <td>ООО  «ыфывфы»</td>
            <td align=center>07.03.2007</td><td align=center></td>
            <td></td>
            <td align=left></td>
            <td></td>
            <td align=center>Нет</td>
                <tr>
                    <td colspan="8" bgcolor=#CCCCCC><img width=1 height=1 alt=""></td>
                    </tr>
<tr>
    
</table>

colspan всю малину портит :( хочю сграбить подобнуб таблицу с данными в массив =\ но изз colspan ничего не могу предпринять -\

   
 
 автор: Disable   (09.06.2007 в 16:16)   письмо автору
 
   для: sidPR   (09.06.2007 в 15:46)
 

про пустые ячейки вы не упоминали :)

preg_match_all('|<td[^>]*>(.*)</td>|sU',$string,$arr);

разницу видите?

   
 
 автор: sidPR   (09.06.2007 в 16:40)   письмо автору
 
   для: Disable   (09.06.2007 в 16:16)
 

да понял в чем разница, а как быть с такой конструкцией где collspan на пост выше которую я написал ... ? :(

   
 
 автор: Disable   (09.06.2007 в 16:42)   письмо автору
 
   для: sidPR   (09.06.2007 в 16:40)
 


<?php
$string
=' <table cellspacing=2 cellpadding=4 class=black12 border="3"> 
<tr> 
    <td><a class=lb href=\'/uk/126\'>МТП</a></td> 
    <td>ЗАО "У тпс мтп"</td> 
    <td align=center>22.02.2003</td> 
    <td align=center></td><td>адрес</td> 
    <td align=left>134-1340314</td><td></td><td align=center>Нет</td> 
        <tr> 
            <td colspan="8" bgcolor=#CCCCCC><img width=1 height=1 alt=""></td> 
        </tr> 
        <tr> 
            <td><a class=lb href=\'/uk/387\'>ЫЫвввы</a></td> 
            <td>ООО  «ыфывфы»</td> 
            <td align=center>07.03.2007</td><td align=center></td> 
            <td></td> 
            <td align=left></td> 
            <td></td> 
            <td align=center>Нет</td> 
                <tr> 
                    <td colspan="8" bgcolor=#CCCCCC><img width=1 height=1 alt=""></td> 
                    </tr> 
<tr> 
     
</table>'
;

preg_match_all('|<td[^>]*>(.*)</td>|sU',$string,$arr);
print_r($arr);

?>


выводит

Array
(
[0] => Array
(
[0] => <td><a class=lb href='/uk/126'>МТП</a></td>
[1] => <td>ЗАО "У тпс мтп"</td>
[2] => <td align=center>22.02.2003</td>
[3] => <td align=center></td>
[4] => <td>адрес</td>
[5] => <td align=left>134-1340314</td>
[6] => <td></td>
[7] => <td align=center>Нет</td>
[8] => <td colspan="8" bgcolor=#CCCCCC><img width=1 height=1 alt=""></td>
[9] => <td><a class=lb href='/uk/387'>ЫЫвввы</a></td>
[10] => <td>ООО «ыфывфы»</td>
[11] => <td align=center>07.03.2007</td>
[12] => <td align=center></td>
[13] => <td></td>
[14] => <td align=left></td>
[15] => <td></td>
[16] => <td align=center>Нет</td>
[17] => <td colspan="8" bgcolor=#CCCCCC><img width=1 height=1 alt=""></td>
)

[1] => Array
(
[0] => <a class=lb href='/uk/126'>МТП</a>
[1] => ЗАО "У тпс мтп"
[2] => 22.02.2003
[3] =>
[4] => адрес
[5] => 134-1340314
[6] =>
[7] => Нет
[8] => <img width=1 height=1 alt="">
[9] => <a class=lb href='/uk/387'>ЫЫвввы</a>
[10] => ООО «ыфывфы»
[11] => 07.03.2007
[12] =>
[13] =>
[14] =>
[15] =>
[16] => Нет
[17] => <img width=1 height=1 alt="">
)

)

   
 
 автор: sidPR   (09.06.2007 в 17:01)   письмо автору
 
   для: Disable   (09.06.2007 в 16:42)
 

спасибо уважаемый Disable , дали пищю для мозгов ..!!

   
 
 автор: sidPR   (19.06.2007 в 23:50)   письмо автору
 
   для: sidPR   (09.06.2007 в 17:01)
 


preg_match_all('|<td[^>]*>(.*)</td>|sU',$string,$arr); 


помогите сие регулярко почемуто не коректо пашет если между <td></td> есть таблица :(


нужно какбы вырезать только инфу которая в <td></td> не зависимой сколько таблиц если в них есть таблица то и из этой таблице тоже все <TD></td>

   
 
 автор: Trianon   (20.06.2007 в 00:19)   письмо автору
 
   для: sidPR   (19.06.2007 в 23:50)
 

регулярные выражения вообще очень хреново себя ведут с данными вложенной структуры...

   
 
 автор: sidPR   (20.06.2007 в 00:45)   письмо автору
 
   для: Trianon   (20.06.2007 в 00:19)
 

а как быть помогите пожалуйста?

   
 
 автор: kasmanaft   (20.06.2007 в 08:05)   письмо автору
 
   для: sidPR   (19.06.2007 в 23:50)
 

> нужно какбы вырезать только инфу которая в <td></td> не зависимой сколько таблиц если в них есть таблица то и из этой таблице тоже все <TD></td>
То есть? Нужно вырезать все <TD></td>, в которых нет таблиц? (а вместо этого вырезать <TD></td> из этой таблицы??)

   
 
 автор: sidPR   (20.06.2007 в 08:11)   письмо автору
 
   для: kasmanaft   (20.06.2007 в 08:05)
 

Нет, тоесть нужно вырезать всю инфу где встречается даже такое


<td>
   <TABLE><TR><TD>TEST</TD></TR></TABLE
</td>


В этом примере регулярка будет вырезать примерно такой кусок "<td>
<TABLE><TR><TD>TEST" а нужно тольео слово Test вот на таких этапах регулярка работает косячно :(

   
 
 автор: sidPR   (20.06.2007 в 16:35)   письмо автору
 
   для: sidPR   (20.06.2007 в 08:11)
 


<tr><td>        
              <table width=100% border=0>
              <tr>
              <td width=45% valign=top>
                  <table width=100% border=0 >
                  <tr><td>
                  <font size=2><b>123456</b></font>
                  </td></tr>
                  <tr><td>
                      <table width=100% >        
                      <tr><td width=50% class=newtd2 valign=top>ТЕст</td><td width=50%>321123321</td></tr>



нужно извлечь только то что между <td></td> в такого вида коде регулярку переклинивает и она впринцепе естественно выдерает начиная с

<td width=45% valign=top>
к примеру захватывает

<table width=100% border=0 >
                  <tr><td>
                  <font size=2><b>123456</b></font>

и останавливется в первой </td> =( помагите регулярку написать которой будет пофигу на вложенности из таблиц ... примного благодарен заранее!!

   
 
 автор: sidPR   (20.06.2007 в 17:41)   письмо автору
 
   для: sidPR   (20.06.2007 в 16:35)
 

я тут вычитал про "Рекурсивные шаблоны" возможно это както поможет я в регулярках полный нуб

   
 
 автор: kasmanaft   (21.06.2007 в 14:06)   письмо автору
 
   для: sidPR   (20.06.2007 в 16:35)
 

Ндааа.... так и с ума сойти не долго :D


<?php
$text 
file_get_contents('http://softtime.ru/forum/read.php?id_forum=6&id_theme=37964&page=1');
preg_match_all('#<td(?>[^>]*)>((?>((?!(<td(?>[^>]*)>|</td>)).)+)|(?R))*</td>#s'$text$regs);
foreach(
$regs[0] as $val)
    echo 
$val.str_repeat("\r\n"15);
?>

   
 
 автор: sidPR   (21.06.2007 в 15:06)   письмо автору
 
   для: kasmanaft   (21.06.2007 в 14:06)
 

Гениально! супер! великолепно... многим пригодится эта регулярка, лично от меня огромное спасибо а тобы я так и извращялся бы для каждой строки своя регулярка!!! Респект вам kasmanaft!

   
 
 автор: sidPR   (21.06.2007 в 17:24)   письмо автору
 
   для: sidPR   (21.06.2007 в 15:06)
 

500 Ошибку кстате выдает =\

   
 
 автор: kasmanaft   (21.06.2007 в 18:31)   письмо автору
 
   для: sidPR   (21.06.2007 в 17:24)
 

Из-за file_get_contents('http://softtime.ru/fo....') ?
Не знаю.. у меня соображает долго (относительно), но работает...
(пробовал запускать в PHP Expert Editor - пустой экран, пошел в Zend Studio - там нормально отработал скрипт)

   
 
 автор: sidPR   (21.06.2007 в 22:04)   письмо автору
 
   для: kasmanaft   (21.06.2007 в 18:31)
 


<?php 
set_time_limit
(100);
$text file_get_contents('http://softtime.ru/forum/read.php?id_forum=6&id_theme=37964&page=1'); 
preg_match_all('#<td(?>[^>]*)>((?>((?!(<td(?>[^>]*)>|</td>)).)+)|(?R))*</td>#s'$text$arr);
echo 
count($arr[1]);
for(
$i=0$i <= count($arr[1])-1$i++){
    echo 
$arr[1][$i]."<br>";
}

?> 



500 Ошибку пишет сохраняю через zende studio

Даже без for всеравно не пашет :(

   
 
 автор: kasmanaft   (21.06.2007 в 22:21)   письмо автору
 
   для: sidPR   (21.06.2007 в 22:04)
 

Ыыы... Попробуйте сохранить страницу, да file_get_contents('123.txt'), думаю, в этом дело.
Хотя.... рекурсия эта ресурсоемкая штука - может быть где-то чего-то не хватает, хз :(
Попробуйте, в конце концов, поменьше страницу какую-нибудь обработать..

   
 
 автор: sidPR   (21.06.2007 в 22:41)   письмо автору
 
   для: kasmanaft   (21.06.2007 в 22:21)
 

он работает но криво вырезает :(

   
 
 автор: kasmanaft   (22.06.2007 в 12:48)   письмо автору
 
   для: sidPR   (21.06.2007 в 22:41)
 

Можно пример?

ЗЫЖ
Перечитал счас ... кое-чего не понял:
> То есть? Нужно вырезать все <TD></td>, в которых нет таблиц?
> (а вместо этого
(прим. если внутри есть таблица) вырезать <TD></td> из этой таблицы??)
___________________________________________________
Нет, тоесть нужно вырезать всю инфу где встречается даже такое
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
В этом примере регулярка будет вырезать примерно такой кусок "<td>
<TABLE><TR><TD>TEST" а нужно тольео слово Test вот на таких этапах регулярка работает косячно :(


Я вроде это и имел ввиду.. Не оч понятно написал, конечно ...
Попробуйте тогда вот такую штуку: #<td[^>]*>(((?!<td[^>]*>).)*)</td>#is
(не проверял, но вроде должно работать)
Можно вместе с предыдущим его использовать...

ЗЫЖЖ если что-то опять не так понял, давайте начнем новую тему, эта уже раздулась сильно...

   
 
 автор: sidPR   (22.06.2007 в 16:04)   письмо автору
 
   для: kasmanaft   (22.06.2007 в 12:48)
 

Продолжение темы:

http://softtime.ru/forum/read.php?id_forum=6&id_theme=39467&page=1

   
Rambler's Top100
вверх

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