|
|
|
| Есть массив 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 работает только со строками. есть идеи как это оптимизировать? | |
|
|
|
|
|
|
|
для: 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.
Понятно что есть массив с отрывками из исключаемых адресов картинок
А в конечном итоге для чего нужны адреса или нужен-ли текст без картинок с исключёнными адресами непонятно | |
|
|
|
|
|
|
|
для: heed
(21.10.2009 в 09:19)
| | функция нужна для того, чтобы вытащить из иллюстрированного материала урл картинки (если она там есть вообще): есть статья, возможно с иллюстрациями, отформатированная как попало, я делаю превью - пара абзацев текста и картинка. приведенная в примере функция вообще ничего с текстом не делает (я его отдельно прогоняю через strip_tags и обрезаю по длине для превью), надо найти все картинки, исключить по маске счетчики, пузомерки, всякие сервисные перделки - и из оставшегося массива картинок взять одну | |
|
|
|
|
|
|
|
для: 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%'> </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> </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($txt, 2); # два раза
$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, $out, PREG_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_dump( single_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_dump( single2_img($txt, $sp) );
| но возможно это будет работать даже медленнее, чем вторая функция с preg_match_all
, где всётаки придётся циклом перебирать совпадения , так-как в самом первом может не быть той картинки (скорости выполнения не тестил)
Похоже на непосредственную обработу результатов в процессе поиска ведёт себя preg_replace_callback() , хотя она тоже пройдётся по всем совпадениям до последнего
, заменяя найденное callback-функцией на что-то другое , или на то-же самое , но возможно оптимальнее такой поиск . | |
|
|
|
|
|
|
|
для: heed
(21.10.2009 в 21:14)
| | вот и меня foreach в квадрате пугает.
то есть заранее неизвестно, сколько будет картинок, подлежащих проверке, но понятно что много в статье быть не может - ну десяток, два? а вот масок для исключения со временем может и пара сотен набежать, работать будет медленно, жаль что нельзя массив масок в одном цикле прогонять :( | |
|
|
|
|
|
|
|
для: kikaha
(21.10.2009 в 21:35)
| | Вашу задачу я не совсем понял почему именно из всех подряд ссылок надо что-то сопоставить
, возможно лучше брать ссылки другим образом
я обычно сразу в выражение частенько закладываю , что если ссылка с
http:// ? то начинаться она должна только так как мне нужно
что-то вроде '#<img[^>]*?src=[\'"]?((?:http://(?:www\.)?'. $this_url .')?(?!http://)[^\'">\s]*)#'
( не уверен насчёт отсутствия ошибок )
, все остальные не обрабатывал ,Но не всегда только одинаковые внешние ссылки нужны и бывает вообще интересует только какой-то определённый блок страницы (там не часто бывет много рекламы), и так обычно и получается , что для каждого конкретного случая получения чего-нибудь получается новый скрипт,
У меня в основном только случались задачи заполучить какой-нибудь контент откуда-нибудь, в более-менее очищеном виде, ато читать не удобно , и удалённые страницы грузятся медленно а читаю я беспорядочно ,) всё время чего-нибудь разукрашивая | |
|
|
|