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

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

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

 

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

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

тема: поиск по массиву и удаление при совпадении с другим массивом
 
 автор: kikaha   (21.10.2009 в 02:04)   письмо автору
 
 

Есть массив src картинок, вытянутый из текста :
$pics=array('0'=>'url0','1'=>'url1','2'=>'url2','3'=>'url3','4'=>'url4',);


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

        if(preg_match("|src=\"(.*?)\"|is",$text,$pics))
 // получили массив
        {

        foreach($picss as $key=>$value)

            {

                        if(

                        (strpos($value,"button.blogs.yandex"))||

                        (strpos($value,"l-stat.livejournal.com"))  // вот вторая маска, а если их будет 20?
                        )

            {unset($pics[$key]);}  // удалили совпадение
            }

        if(!empty($pics[0]))
 // просто проверка (если все картинки попали под фильтр) - быстрее чем считать sizeof
        return $pics[0];

        else

        return false;

        }


есть желание этот кусочек с перечислением паттернов:

                        (strpos($value,"button.blogs.yandex"))||

                        (strpos($value,"l-stat.livejournal.com")) // вот вторая маска, 


передавать в функцию в виде массива, вместе с массивом картинок - это позволит работать с массивами, не ковыряя каждый раз руками функцию, но strpos работает только со строками. есть идеи как это оптимизировать?

  Ответить  
 
 автор: heed   (21.10.2009 в 09:19)   письмо автору
 
   для: kikaha   (21.10.2009 в 02:04)
 

скорее придётся прогонять в foreach этот массив с исключениями
, чем нужен foreach для обработси массива из preg_match()
<pre><?
$text
'
<img src="ground.gif"/>
<img src="back.gif"/>
'
;

if(
preg_match("|src=\"(.*?)\"|is",$text,$pics))
print_r($pics);
?>

А так непонятно для чего вообще нужна функция и что у неё на входе , понятно что имеется текст , возможно с неким колличеством тегов img.
Понятно что есть массив с отрывками из исключаемых адресов картинок
А в конечном итоге для чего нужны адреса или нужен-ли текст без картинок с исключёнными адресами непонятно

  Ответить  
 
 автор: kikaha   (21.10.2009 в 14:38)   письмо автору
 
   для: heed   (21.10.2009 в 09:19)
 

функция нужна для того, чтобы вытащить из иллюстрированного материала урл картинки (если она там есть вообще): есть статья, возможно с иллюстрациями, отформатированная как попало, я делаю превью - пара абзацев текста и картинка. приведенная в примере функция вообще ничего с текстом не делает (я его отдельно прогоняю через strip_tags и обрезаю по длине для превью), надо найти все картинки, исключить по маске счетчики, пузомерки, всякие сервисные перделки - и из оставшегося массива картинок взять одну

  Ответить  
 
 автор: heed   (21.10.2009 в 21:14)   письмо автору
 
   для: kikaha   (21.10.2009 в 14:38)
 

В php нет такой конструкции как например в javascript или perl
while ($txt =~ /<img.*>/i)
циклов где при каждой операции будет поиск совпадения и другой инфы о нём
, что-то похожее можно сконструировать как здесь в первой функции
<pre><?php

$txt
= <<<TXT
и из оставшегося массива картинок взять одну</p></td><td></td></tr><tr>
<td width='7.655%'>&nbsp;</td>
<td class='postmenu'>
<img border='0' src='../skins/extend/images/pen.gif' width='20' height='15'><a href=addpost.php?id_forum=6&id_theme=68942&id_post=403826>Ответить</a>
</td>
<td>&nbsp;</td></tr></table></td></tr></table>
<div width='450px' style='float: left; padding: 10px 0px 0px 0px;'>
<a target='_blank' href='http://www.art-time.org' title='Концертное агенство Art-Time'>
<img src='../images2/banners/zemlyanee.gif' width='605' height='60' alt='Концерт группы Земляне' border='0'>
</a>
</div></body>
TXT
;
$txt str_repeat($txt2); # два раза

$sp = array('../images2/banners''l-stat.livejournal.com');

function 
single_img(&$spare) {
    global 
$txt;
    
$offset 0;

 while( 
preg_match(
    
'#<img\s[^>]*\bsrc=["\']?([^\s\'"]+)[^>]*>#i'
    
$txt$outPREG_OFFSET_CAPTURE,  $offset)
  &&  
$offset += $out[0][1] + strlen($out[0][0])) {
     
// print_r($out);
 
foreach($spare AS $child) {
 if (
strpos($out[1][0], $child) === FALSE) {
    return 
$out[1][0];
    }
 }
 }
 return 
false;
}

var_dumpsingle_img($sp) );
?><hr>
<?php

function single2_img(&$txt, &$spare) {
preg_match_all(
    
'#<img\s[^>]*\bsrc=["\']?([^\s\'"]+)[^>]*>#i'
    
$txt$out);
 
//print_r($out);
 
foreach($out[1] AS $link){
 foreach(
$spare AS $child) {
  if (
strpos($link$child) === FALSE) {
    return 
$link;
    }
 }
 }
 return 
false;
}

var_dumpsingle2_img($txt$sp) );
но возможно это будет работать даже медленнее, чем вторая функция с preg_match_all
, где всётаки придётся циклом перебирать совпадения , так-как в самом первом может не быть той картинки (скорости выполнения не тестил)

Похоже на непосредственную обработу результатов в процессе поиска ведёт себя preg_replace_callback() , хотя она тоже пройдётся по всем совпадениям до последнего
, заменяя найденное callback-функцией на что-то другое , или на то-же самое , но возможно оптимальнее такой поиск .

  Ответить  
 
 автор: kikaha   (21.10.2009 в 21:35)   письмо автору
 
   для: heed   (21.10.2009 в 21:14)
 

вот и меня foreach в квадрате пугает.
то есть заранее неизвестно, сколько будет картинок, подлежащих проверке, но понятно что много в статье быть не может - ну десяток, два? а вот масок для исключения со временем может и пара сотен набежать, работать будет медленно, жаль что нельзя массив масок в одном цикле прогонять :(

  Ответить  
 
 автор: heed   (21.10.2009 в 22:32)   письмо автору
 
   для: kikaha   (21.10.2009 в 21:35)
 

Вашу задачу я не совсем понял почему именно из всех подряд ссылок надо что-то сопоставить
, возможно лучше брать ссылки другим образом
я обычно сразу в выражение частенько закладываю , что если ссылка с
http:// ? то начинаться она должна только так как мне нужно
что-то вроде '#<img[^>]*?src=[\'"]?((?:http://(?:www\.)?'. $this_url .')?(?!http://)[^\'">\s]*)#'
( не уверен насчёт отсутствия ошибок )
, все остальные не обрабатывал ,Но не всегда только одинаковые внешние ссылки нужны и бывает вообще интересует только какой-то определённый блок страницы (там не часто бывет много рекламы), и так обычно и получается , что для каждого конкретного случая получения чего-нибудь получается новый скрипт,
У меня в основном только случались задачи заполучить какой-нибудь контент откуда-нибудь, в более-менее очищеном виде, ато читать не удобно , и удалённые страницы грузятся медленно а читаю я беспорядочно ,) всё время чего-нибудь разукрашивая

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

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