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_replace [3]

 PHP.SU

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


 Страниц (4): « 1 2 [3] 4 »   

> Описание: добавить некий текст к элементу массива
Okula
Отправлено: 15 Декабря, 2011 - 20:13:28
Post Id



Участник


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


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




Belohalatny пишет:
Ваш код выполнил одно действие.

Что находится в переменной $AUyears[0][0][1] массив нужно передавать весь, а не только его одно значение.
Если весь массив содержится в переменной $AUyears, то и нужно передавать эту переменную. Код должен был выглядеть так:

PHP:
скопировать код в буфер обмена
  1. $ar_iterator = new ArrayIterator($AUyears);
  2.  
  3. $new_arr = array(); // массив с данными полученными при переходе по ссылкам
  4.  
  5. foreach(new RecursiveArrayIterator($ar_iterator) as $val) {
  6.  
  7.     $link = 'http://===fo/'.$val;
  8.  
  9.     $result = get($link, $prox[0]); // тут передашь в функцию всё что нужно, я не знаю что она у тебя принимает.
  10.  
  11.     echo "Перешли по ссылке ".$link.".<br/>";
  12.  
  13.     // я передал только ссылку
  14.  
  15.    
  16.  
  17.     if(preg_match_all('|<A href="(.+?)".*?><img src="(.+?)" width="75" height="54" border="0" alt="(.+?)"></a.*?> |', $result, $A1)) {
  18.  
  19.         $new_arr[] = $A1;
  20.  
  21.     }
  22.  
  23. }
  24.  
  25.  
  26. print_r($new_arr);
 
 Top
Belohalatny
Отправлено: 15 Декабря, 2011 - 20:32:06
Post Id


Гость


Покинул форум
Сообщений всего: 84
Дата рег-ции: Нояб. 2011  


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




Okula пишет:
Belohalatny пишет:
Ваш код выполнил одно действие.

Что находится в переменной $AUyears[0][0][1] массив нужно передавать весь, а не только его одно значение.
Если весь массив содержится в переменной $AUyears, то и нужно передавать эту переменную. Код должен был выглядеть так:

PHP:
скопировать код в буфер обмена
  1. $ar_iterator = new ArrayIterator($AUyears);
  2.  
  3. $new_arr = array(); // массив с данными полученными при переходе по ссылкам
  4.  
  5. foreach(new RecursiveArrayIterator($ar_iterator) as $val) {
  6.  
  7.     $link = 'http://===fo/'.$val;
  8.  
  9.     $result = get($link, $prox[0]); // тут передашь в функцию всё что нужно, я не знаю что она у тебя принимает.
  10.  
  11.     echo "Перешли по ссылке ".$link.".<br/>";
  12.  
  13.     // я передал только ссылку
  14.  
  15.    
  16.  
  17.     if(preg_match_all('|<A href="(.+?)".*?><img src="(.+?)" width="75" height="54" border="0" alt="(.+?)"></a.*?> |', $result, $A1)) {
  18.  
  19.         $new_arr[] = $A1;
  20.  
  21.     }
  22.  
  23. }
  24.  
  25.  
  26. print_r($new_arr);

сделал, как писали. Результат:
 
 Top
Okula
Отправлено: 15 Декабря, 2011 - 20:51:27
Post Id



Участник


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


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




А уверены что регулярка составлена правильно? Ваше регулярное выражение будет работать только на 1-ой строке (первой). Для того чтобы она искала совпадения по шаблону во всём тексте нужно поставить модификатор s
Тегулярка должна быть такой:
CODE (php):
скопировать код в буфер обмена
  1. |<A href="(.+?)".*?><img src="(.+?)" width="75" height="54" border="0" alt="(.+?)"></a.*?> |s
 
 Top
DlTA
Отправлено: 15 Декабря, 2011 - 20:58:41
Post Id



Постоянный участник


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


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




Belohalatny пишет:
$$inArrUrl[$key] = multiLoad($item,$prox,$site);
двойной знак доллара в начале должен быть, или Вы опечатались просто?

очепятка, должен быть 1
возвращает вообще пустой массив или
много уровневый но пустой??
если многоуровневый но пустой
то это значит не сработала регулярка
 
 Top
Belohalatny
Отправлено: 15 Декабря, 2011 - 21:03:05
Post Id


Гость


Покинул форум
Сообщений всего: 84
Дата рег-ции: Нояб. 2011  


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




Как то так получается, что мы вроде друг друга не понимаем...

Ваш код выполнился ровно 38 раз, ровно столько ключей в массиве $AUyears[0-37], "вглубь" данного массива Ваш код не заходит и не вытаскивает ссылки, которые находятся, например в ключах $AUyears[0][0][1][0...100], $AUyears[3][0][1][0...87], $AUyears[28][0][1][0...3] и так далее... То, что вывел мне браузер при работе Вашего кода:
CODE (html):
скопировать код в буфер обмена
  1. Перешли по ссылке http://===fo/Array.
  2. Перешли по ссылке http://===fo/Array.
  3. ....
  4. Перешли по ссылке http://=o/Array.
  5. Перешли по ссылке http://=nfo/Array.
  6. .... и так 38 раз...


А регулярка работает исправно, тут Вы зря...
 
 Top
DlTA
Отправлено: 15 Декабря, 2011 - 21:09:16
Post Id



Постоянный участник


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


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




а врегулярке походу реальные проблемы
добавьте в конец модификатор i а то сомнения что все ссылки пишутся именно с большой буквы
 
 Top
Belohalatny
Отправлено: 15 Декабря, 2011 - 21:12:48
Post Id


Гость


Покинул форум
Сообщений всего: 84
Дата рег-ции: Нояб. 2011  


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




Запутали вы меня, так всё таки s или i? Или то и другое? Сейчас проверяю с s, потом поменяю на i.
(Добавление)
DlTA пишет:
а врегулярке походу реальные проблемы
добавьте в конец модификатор i а то сомнения что все ссылки пишутся именно с большой буквы


При выполнении Вашего кода ссылки имеют вид (по которым бегает ф-ция):
CODE (html):
скопировать код в буфер обмена
  1. Перешли по ссылке http://==fo/base/au/3/948/696
это правильные ссылки, что получится в выходном массиве, сейчас проверю.
(Добавление)
С модификатором i не сработало, никакого массива не создалось вообще, и ошибок тоже нету и с модификатором s тоже самое. Может, всё таки, в функции ошибка?
 
 Top
Okula
Отправлено: 15 Декабря, 2011 - 21:39:44
Post Id



Участник


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


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




Belohalatny, ты противоречишь сам себе. Твоя регулярка не будет работать дальше первой троки без модификатора s, если конечно код со страницы которую ты парсишь не в одну строку написан.
Интерфейс RecursiveArrayIterator позволяет просматривать массивы любой вложенности. Для примера можешь тестануть вот этот код:
PHP:
скопировать код в буфер обмена
  1. $a = array('a','b',array('c','d',array('e',array('s'))));
  2. $iteration = new ArrayIterator($a);
  3. foreach(new RecursiveArrayIterator($iteration) as $val) {
  4.  echo $val.', ';
  5. }
  6.  
  7. // результат работы будет:
  8. // a, b, c, d, e, s,

(Отредактировано автором: 15 Декабря, 2011 - 21:40:50)

 
 Top
DlTA
Отправлено: 15 Декабря, 2011 - 21:44:58
Post Id



Постоянный участник


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


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




а ошибка реально в функции
PHP:
скопировать код в буфер обмена
  1. function multiLoad($inArrUrl,$prox,$site){
  2.         if (is_array($inArrUrl)){
  3.                 foreach($inArrUrl as $key=>$item){
  4.                         $inArrUrl[$key] = multiLoad($item,$prox,$site);
  5.                 }
  6.         }
  7.         else{
  8.                                 $content = get($site.$inArrUrl, $prox);
  9.                 if(preg_match_all('|<A href="(.+?)".*?><img src="(.+?)" width="75" height="54" border="0" alt="(.+?)"></a.*?> |', $content, $A1)){
  10.                         $inArrUrl = $A1; // исправил
  11.                 }
  12.                                 else{
  13.                                         $inArrUrl = false; // добавил
  14.                                 }
  15.         }
  16.         return $inArrUrl; // исправил
  17. }
  18.  
  19.  
  20. $result = multiLoad($inArrUrl,$prox,$site);
  21. var_dump($result);

(Отредактировано автором: 15 Декабря, 2011 - 21:46:15)

 
 Top
Belohalatny
Отправлено: 15 Декабря, 2011 - 22:20:53
Post Id


Гость


Покинул форум
Сообщений всего: 84
Дата рег-ции: Нояб. 2011  


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




Работает! Спасибо огромное! Теперь буду разбираться, как с ним работать дальше, если появятся вопросы (а я думаю, что они появятся Улыбка)- напишу!
 
 Top
Belohalatny
Отправлено: 16 Декабря, 2011 - 09:52:12
Post Id


Гость


Покинул форум
Сообщений всего: 84
Дата рег-ции: Нояб. 2011  


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




А как мне добавить ещё несколько условий в preg_match_all?
есть вот этот:
PHP:
скопировать код в буфер обмена
  1. preg_match_all('|<A href="(.+?)".*?><img src="(.+?)" width="75" height="54" border="0" alt="(.+?)"></a.*?> |', $content, $A1)
, он обрабатывает вот этот html:
CODE (html):
скопировать код в буфер обмена
  1. <A href="/base/se/3/136/130/1"><img src="/img/base/1s.png" width="75" height="54" border="0" alt="Двигатель, сцепление"></a> <A href="/base/se/3/136/130/2"><img src="/img/base/2s.png" width="75" height="54" border="0" alt="Топливный бак и трубы, система выпуска ОГ, обогрев"></a> <A href="/base/se/3/136/130/3"><img src="/img/base/3s.png" width="75" height="54" border="0" alt="Трансмиссия"></a> <A href="/base/se/3/136/130/4"><img src="/img/base/4s.png" width="75" height="54" border="0" alt="Передняя ось, раздаточная коробка, рулевое управление"></a> <A href="/base/se/3/136/130/5"><img src="/img/base/5s.png" width="75" height="54" border="0" alt="Задняя ось"></a> <A href="/base/se/3/136/130/6"><img src="/img/base/6s.png" width="75" height="54" border="0" alt="Колеса, тормоза"></a> <A href="/base/se/3/136/130/7"><img src="/img/base/7s.png" width="75" height="54" border="0" alt="Ручные и ножные рычаги, защитные экраны"></a> <A href="/base/se/3/136/130/8"><img src="/img/base/8s.png" width="75" height="54" border="0" alt="Кузов"></a> <A href="/base/se/3/136/130/9"><img src="/img/base/9s.png" width="75" height="54" border="0" alt="Электрооборудование"></a> <A href="/base/se/3/136/130/0"><img src="/img/base/0s.png" width="75" height="54" border="0" alt="Аксессуары"></a>
в этом же html файле, выше данного кода, есть ещё такой:
CODE (html):
скопировать код в буфер обмена
  1. <div class="navbar"><a href="/">Каталог</a> <strong>SEAT</strong> | <a href="/base/se">Рынок</a> <strong>Местный рынок</strong> | <a href="/base/se/3">Модель</a> <strong>Toledo</strong> 1992</strong></div>
из него я вытащил текст такой регуляркой:
PHP:
скопировать код в буфер обмена
  1. preg_match_all('|(Каталог</a> <strong>(.+?)</strong> | <a href="(.+?)">Рынок</a> <strong>Местный рынок</strong> | <a href="(.+?)">Модель</a> <strong>(.+?)</strong>(.+?)</strong></div></td>|')
теперь собственно сам вопрос: как эти две регулярки скрестить в одну, чтобы она записывала сразу всё в один массив? Знаю что модификатор "|" означает "или" и оба регулярных выражения надо поместить в скобки, а вот как записать модификатор "и"- не знаю...
 
 Top
DlTA
Отправлено: 16 Декабря, 2011 - 13:27:57
Post Id



Постоянный участник


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


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




Belohalatny пишет:
preg_match_all('|(Каталог</a> <strong>(.+?)</strong> | <a href="(.+?)">Рынок</a> <strong>Местный рынок</strong> | <a href="(.+?)">Модель</a> <strong>(.+?)</strong>(.+?)</strong></div></td>|

хрень какая то
а если напишут не "Местный рынок" что то другое, придется исправлять весь код?
у вас есть шаблон
/\|\s*<a href="(.+?)">([^<]+)</a> <strong>([^<]+)</strong>\s*\|/i
вот по такому шаблону и находите все подобные варианты

Belohalatny пишет:
как эти две регулярки скрестить в одну, чтобы она записывала сразу всё в один массив?
а уверены что нужно именно это?, так как результат работы регулярок не всегда соответствует нужному формату массива (раздует до беспредела)
может есть смысл пересмотреть логику?


надо попробывать такую регулярку, так что выше немного не подходит
/\|\s*<a\s+href="(.+?)">(.+?)</a>\s*<strong>(.+?)</strong>\s*\|/i
 
 Top
Belohalatny
Отправлено: 16 Декабря, 2011 - 13:57:09
Post Id


Гость


Покинул форум
Сообщений всего: 84
Дата рег-ции: Нояб. 2011  


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




Сейчас есть функция, написанная Вами, ничего в ней не менял.
PHP:
скопировать код в буфер обмена
  1.     function partcategory($inArrUrl,$prox,$site){  // Функция прогоняет массив из ссылок на группы деталей и загоняет значения, выдранные регуляркой из каждой пройденной ссылки в новый массив.
  2.         if (is_array($inArrUrl)){
  3.                 foreach($inArrUrl as $key=>$item){
  4.                         $inArrUrl[$key] = partcategory($item,$prox,$site);
  5.                 }
  6.         }
  7.         else{
  8.                                 $content = get($site.$inArrUrl, $prox);
  9.                                 echo "Перешли по ссылке ".$site.$inArrUrl.".<br/>";
  10.                 if(preg_match_all("/location.href='(.*?)'|<a name=\"(.*?)\">(.*?)<\/div.*?>|<div id='g00' style=\"width: 55px;\">(.*?)<\/div.*?>|<td width=\"50%\" valign=\"top\".*?>(.*?)<\/td.*?>|<td width=\"50%\" valign=\"top\">(.*?)<\/td.*?>|<td width=\"100\" valign=\"top\"><div style=\"width: 100px;\">(.*?)<\/div.*?><\/td.*?>/", $content, $A1)){
  11.                        $inArrUrl = $A1;// исправил
  12.                 }
  13.         }
  14.         return $inArrUrl;       // исправил
  15.     }
Хотелось бы, чтобы полученные массивы группировались по принципу [пройденная_ссылка] => [значения_с_пройденной ссылки]. Сейчас в массивах творится полный хаос, так как они уже получаются огромные и работать с ними становится просто невозможно...

(Отредактировано автором: 21 Декабря, 2011 - 18:11:58)

 
 Top
DlTA
Отправлено: 21 Декабря, 2011 - 18:41:50
Post Id



Постоянный участник


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


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




вариант (Отобразить)
 
 Top
Belohalatny
Отправлено: 21 Декабря, 2011 - 19:29:46
Post Id


Гость


Покинул форум
Сообщений всего: 84
Дата рег-ции: Нояб. 2011  


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




Отлично, всё получилось. Вопрос, тоже связанный со скриптом: данная функция создала массивы следующего содержания. Их получилось 8 штук, примерно так:
CODE (html):
скопировать код в буфер обмена
  1.  
  2.     [0] => Array
  3.         (
  4.             [0] => 0
  5.             [1] =>
  6.             [2] => 2
  7.             [3] =>
  8.             [4] =>
  9.             [5] => 5
  10.             [6] => 6
  11.             [7] =>
  12.             [8] =>
  13.             [9] => 9
  14.         )
  15.  
  16.     [1] => Array
  17.         (
  18.             [0] =>
  19.             [1] => 1
  20.             [2] =>
  21.             [3] => 3
  22.             [4] => 4
  23.             [5] =>
  24.             [6] =>
  25.             [7] => 7
  26.             [8] => 8
  27.             [9] =>
  28.         )
  29.  
теперь сам вопрос: как массивы с ключами [0] и [1] объединить в один, с сохранением порядка ключей и их значений, чтобы на выходе получилось так:

CODE (html):
скопировать код в буфер обмена
  1.             [0] => 0
  2.             [1] => 1
  3.             [2] => 2
  4.             [3] => 3
  5.             [4] => 4
  6.             [5] => 5
  7.             [6] => 6
  8.             [7] => 7
  9.             [8] => 8
  10.             [9] => 9
? array_merge мне не помог...
 
 Top
Страниц (4): « 1 2 [3] 4 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB