Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: preg_match_all пропускает второе вхождение

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Koqw
Отправлено: 24 Августа, 2014 - 18:45:41
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Вот этот код:
Содержимое строки $string написано упрощенно, просто для лучшего понимания.

PHP:
скопировать код в буфер обмена
  1. $string = '<div class="feed-i">111</div><div class="feed-i">222</div><div class="feed-i">333</div><div class="feed-i">444</div><div class="feed-i">555</div>';
  2.      preg_match_all( '/<div class="feed-i">(.*)<div class="feed-i">/isU' , $string , $m_matches );
  3.      foreach ($m_matches as $val) {
  4.      $matches0 = '<div class="feed-i">'.$val[0];
  5.      $matches1 = '<div class="feed-i">'.$val[1];
  6.           }
  7. print_r($matches0."\n".$matches1."\n");


Результат выведет:
Цитата:
<div class="feed-i">111</div>
<div class="feed-i">333</div>


а надо вывести вот что:
Цитата:
<div class="feed-i">111</div>
<div class="feed-i">222</div>


Само выражение для парсинга <div class="feed-i">(.*)<div class="feed-i"> менять НЕЛЬЗЯ.
(В примере я упрощенно написал, но в реальном случае никак иначе спарсить кроме как я указал невозможно, то есть парсить по <div class="feed-i">(.*)<\/div> не вариант)
Как сделать что бы выводилось так?:

Цитата:
<div class="feed-i">111</div>
<div class="feed-i">222</div>

(Отредактировано автором: 24 Августа, 2014 - 18:46:37)

 
 Top
OrmaJever Модератор
Отправлено: 24 Августа, 2014 - 19:03:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




мне кажется проблема в том что вы выводите $matches после цикла и туда попадают только последние значения


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Koqw
Отправлено: 24 Августа, 2014 - 19:41:24
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




OrmaJever пишет:
мне кажется проблема в том что вы выводите $matches после цикла и туда попадают только последние значения


В самом цикле ставил, все равно не то.
Функция работает так как и должна работать, второй блок <div class="feed-i">222</div> в нее не попадает, потому что часть его уже попала в первое вхождение - так вроде если правильно выразился.
Но может как то можно через дополнительные параметры вывести <div class="feed-i">222</div> ?
 
 Top
OrmaJever Модератор
Отправлено: 24 Августа, 2014 - 19:44:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




а теперь вижу, я сразу не глянул хорошо на регулярку и думал у вас
CODE (htmlphp):
скопировать код в буфер обмена
  1. <div class="feed-i">(.*)</div>


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


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Koqw
Отправлено: 24 Августа, 2014 - 20:00:24
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Нет, не нужно через один.
Нужно только первое и второе вхождение.
А берется первое и третье.
Беру по такой регулярке <div class="feed-i">(.*)<div class="feed-i">, потому что иначе никак, поскольку в реальном примере перед повторяющимися блоками <div class="feed-i">
могут быть сколько угодно </div> и другие теги.

Примерно что то типа этого:
Цитата:
<div class="feed-i"><div><div>111</div></div></div>
<div class="feed-i"><ul><div>222</div></ul></div>
<div class="feed-i">....333</div>/div></div>/div></div>
<div class="feed-i">....444</div>/div></li><ul></div>/div></div>
<div class="feed-i">....555</div></li></div>/div>


дополнение: и само собой концовки после 111 и 222 могуть быть рандомные с разными тегами, не обязательно всегда так как я выше указал.

(Отредактировано автором: 24 Августа, 2014 - 20:09:10)

 
 Top
OrmaJever Модератор
Отправлено: 24 Августа, 2014 - 20:07:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




а вы U из флагов уберите и попробуйте
CODE (htmlphp):
скопировать код в буфер обмена
  1. '#<div class="feed-i">(.+?)</div>#is'

(Добавление)
и то что получилось пропустить через strip_tags


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Koqw
Отправлено: 24 Августа, 2014 - 20:23:56
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




OrmaJever пишет:
а вы U из флагов уберите и попробуйте
CODE (htmlphp):
скопировать код в буфер обмена
  1. <div class="feed-i">(.+?)</div>


Нет, вы не так поняли, мне нужно все содержимое <div class="feed-i">...</div> включая вложенные в него div
Перед вновь повторяющимися <div class="feed-i"> может быть огромое и рандмное количество заканчивающихся тегов </div>, а так же других тегов, и между ними не всегда цифры.

Так как вы написали он будет искать самый первый встречающийся </div> и возьмет все что до него.

если у меня строка наример <div class="feed-i"><div><div>111</div></div></div>
то он возьмет <div class="feed-i"><div><div>111</div>
А это не то.

(Отредактировано автором: 24 Августа, 2014 - 20:34:23)

 
 Top
OrmaJever Модератор
Отправлено: 24 Августа, 2014 - 20:41:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




хммм... а вот такой вариант?
PHP:
скопировать код в буфер обмена
  1. $match = explode('<div class="feed-i">', $string);

и с каждой строки удалить закрывающий div Растерялся


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 24 Августа, 2014 - 20:53:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Используйте полновесный парсер HTML.
Регуляркой это делать неправильно.


-----
PostgreSQL DBA
 
 Top
Koqw
Отправлено: 24 Августа, 2014 - 21:02:47
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




OrmaJever пишет:
хммм... а вот такой вариант?
PHP:
скопировать код в буфер обмена
  1. $match = explode('<div class="feed-i">', $string);

и с каждой строки удалить закрывающий div Растерялся


а как тут быть если идет так:
CODE (html):
скопировать код в буфер обмена
  1. <div class="feed-iXXX">...<div class="feed-iYYY">...<div class="feed-iZZZ">..


где XXX YYY и ZZZ это рандомные числа?
(Добавление)
Мелкий пишет:
Используйте полновесный парсер HTML.
Регуляркой это делать неправильно.

что значит полновесный парсер html? впервые слышу, в гугле ничего не нашел

(Отредактировано автором: 24 Августа, 2014 - 21:03:22)

 
 Top
Мелкий Супермодератор
Отправлено: 24 Августа, 2014 - 21:25:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Koqw пишет:
в гугле ничего не нашел

"php html parser"?
Серьёзно? Ничего?
DomDocument, Simple HTML DOM, htmlSQL, phpQuery, Zend_Dom_Query
В моей выдаче третей же строкой список разных парсеров на хабре: http://habrahabr[dot]ru/post/176635/


-----
PostgreSQL DBA
 
 Top
Koqw
Отправлено: 24 Августа, 2014 - 21:58:29
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Мелкий пишет:
Koqw пишет:
в гугле ничего не нашел

"php html parser"?
Серьёзно? Ничего?
DomDocument, Simple HTML DOM, htmlSQL, phpQuery, Zend_Dom_Query
В моей выдаче третей же строкой список разных парсеров на хабре: http://habrahabr.ru/post/176635/


Искал изначально по "полновесный парсер html" как вы и написали вначале.
Спс всем за помощь.
 
 Top
Bartolomey
Отправлено: 09 Января, 2015 - 16:25:40
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Янв. 2015  


Помог: 0 раз(а)




Здравствуйте, всех с праздниками

У меня подобная проблема.

Есть такой код

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $url = "http://fiorito.com.ua/353316_534.html";
  4.  
  5. function FetchUrl($url, $postvars, $timeout, $ref, $blank){
  6.  
  7. sleep($timeout);
  8.  
  9. echo @date("r")." fetching $url \r\n";
  10.  
  11. $ch = curl_init();
  12.  
  13. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
  14.  
  15. curl_setopt($ch, CURLOPT_HEADER, false);
  16.  
  17. curl_setopt($ch, CURLOPT_TIMEOUT,30);
  18.  
  19. curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
  20.  
  21. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  22.  
  23. curl_setopt($ch, CURLOPT_URL, trim($url));
  24.  
  25. curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
  26.  
  27. $result = curl_exec($ch);
  28.  
  29. if($blank == "1"){
  30.  
  31. $result = preg_replace("/\n/", "", $result);
  32.  
  33. $result = preg_replace("/\r/", "", $result);
  34.  
  35. }
  36.  
  37.  
  38. return $result;
  39.  
  40. }
  41.  
  42. $page = FetchUrl($url, NULL, NULL, NULL, NULL);
  43.  
  44. preg_match_all("#\)1(.+?)cv#sim", $page, $out);
  45.  
  46. $hj =1;
  47.  
  48. foreach($out[1] as $link){
  49.  
  50. exec("echo '".$link."' >> ".$hj.".txt");
  51.  
  52. $hj++;
  53.  
  54. }
  55.  
  56. ?>


Парсит файл со статьями. Помещает их в отдельные файлы, с номером по порядку.
Проблема: По факту из порядка выпадают некоторые файлы, не создаются. То есть вместо 776 файлов, получается 424 файла.

Перепробовал всяческие вариации регулярных выражений, Такие и им подобные

PHP:
скопировать код в буфер обмена
  1. preg_match_all("/\)1([\n\s\r\t\f\w\d А-ЯЭЫЪЬЩЁІЇЄа-яэыъьщёіїє0-9A-Za-z\0032\»\«\-\—\–\{\}\]\[\!\@\#\\\№\$\%\^\&\*\(\)\_\=\+\/\?\,\.\;\:\'\`\~\|\"\<\>\ ]*?)\(cv/im", $page, $out);


Результат один. Уже убил сутки на эксперименты с регулярными выражениями. Пытался найти что не будь по preg_match_all, может у кого были подобные проблемы, ничего найти не смог, наверное плохо искал или не там искал или не то искал.
Люди добрые помогите, направьте на путь истинный. Что я упускаю?

При желании можете провести следственный эксперимент. По указанному в парсере адресу, лежит файле в котором 2-ве статьи, парсер почему то создаёт только один файл.

(Отредактировано автором: 10 Января, 2015 - 03:57:12)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB