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 :: Картинка в ссылке, жадность

 PHP.SU

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


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

> Описание: Жадная preg_replace
ruboss007
Отправлено: 21 Ноября, 2014 - 02:14:54
Post Id


Новичок


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


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




Всем привет, есть ссылка, в которой находиться изображение ( вот пример как выглядит на скрине http://gyazo[dot]com/89243a377c82a8a[dot][dot][dot]86d5584338ae552e ), его нужно заменить на ключевое слово, делаю это с помощью preg_replace, c вот таким шаблоном
CODE (htmlphp):
скопировать код в буфер обмена
  1. $pattern = "/<a.*?>.*?<img.*?>.*?<\/a>/";
Но работает не верно, после выполнения функции в тексте, ссылки, которые шли до изображения стираются тоже... Кто знает почему так происходит?

Update:

Сделал через simple dom html
CODE (htmlphp):
скопировать код в буфер обмена
  1. private function hideImg($str){
  2.                 $link = null;
  3.                 $replacementi = "и_м_3192";
  4.                 $pattern = "/<a.*?>.*?(<img.*?>)<\/a>/";                                //поиск картинок в ссылках
  5.                
  6.                 //var_dump(htmlentities($pattern));
  7.                 preg_match_all($pattern,$str,$out);
  8.                 if(count($out[1]) > 0){
  9.                         $img = $out[1];
  10.                 }      
  11.                 if($img != null){
  12.                         $search = str_get_html($str);
  13.                         $ael = $search->find("a");
  14.                         $cnt = 0;
  15.                         $aArr = array();
  16.                         for($i=0;$i<count($ael);$i++){
  17.                                 $ael2 = $search->find("a",$i);
  18.                                 if($ael2 != null && $ael2){
  19.                                         $iel = $ael2->find("img",0);
  20.                                         if($iel != null & $iel){
  21.                                                 $aArr[] = $ael2->outertext;
  22.                                                 $cnt++;
  23.                                         }
  24.                                 }
  25.                         }
  26.                         for($i=0; $i<$cnt; $i++){
  27.                                 $pattern = $aArr[$i];
  28.                                 $str = str_replace($aArr[$i],$replacementi,$str);
  29.                                 //$str = preg_replace($pattern,$replacementi,$str);
  30.                         }
  31.                         $arr["str"] = $str;
  32.                         $arr["arr"] = $img;
  33.                         $arr["count"] = $cnt;
  34.                         $arr["mask"] = $replacementi;
  35.                         return $arr;
  36.                 }
  37.                 else
  38.                         return false;
  39.         }

(Отредактировано автором: 21 Ноября, 2014 - 12:30:37)

 
 Top
duhon
Отправлено: 24 Ноября, 2014 - 19:37:59
Post Id



Гость


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


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




simple dom html точно будет надежней и правильней такое обрабатывать
а регулярка не работала из за этого .*? даже не жадный он кушает все подряд
если заменить хотябы на [^>]*
 
 Top
MiksIr
Отправлено: 24 Ноября, 2014 - 19:43:28
Post Id


Забанен


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


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

[+]


Точка не включает в себя перевод строк. Что бы включала - нужно добавить модификатор s
(Добавление)
Тут проблема в другом. На указанном примере все отработает. А вот если случится
<a ...>текст</a><a ...><img ..></a>, то взято будет не второе a, а весь блок.


-----
self-banned
 
 Top
duhon
Отправлено: 24 Ноября, 2014 - 19:45:58
Post Id



Гость


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


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




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

Добавил
смотри
регулярка "/<a.*?>.*?<img.*?>.*?<\/a>/" в которой нету модификатора s

<a ...>\n<img ..>\n</a> не работает
<a ...>текст</a>\n<a ...>\n<img ..>\n</a> не работает

<a ...><img ..></a> работает
<a ...>текст</a><a ...><img ..></a> работает и точка пожирает все подрят, ее никто не остановит кроме img (а если убрать нежадность то ее и img не остановит)

а я предложил тебе умерить апетит точки например так <a[^>]*>[^<]*<img[^>]*>[^<]*<\/a>
<a ...><img ..></a> работает
<a ...>текст</a><a ...><img ..></a> работает (совпадает только <a ...><img ..></a>)

(Отредактировано автором: 24 Ноября, 2014 - 20:05:38)

 
 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