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

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

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

 

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

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

тема: Или str_replace, или регулярка, или у меня кривые руки
 
 автор: Deed   (27.03.2011 в 22:16)   письмо автору
71.5 Кб
 
 

Преамбула.
Попытка сделать обработчик textarea и скрипт, который бы сам обрамлял перед загоном в базу тегами любое количество ссылок на изображения, если они есть, и делал кликабельными обычные ссылки.
Чтобы не толочь воду, обработчики безопасности приводить тут не буду, но они есть :) С этим все ОК.
Итак.

<?
//Обработчик получает из текстареи примерно такое:

$answer=<<< DEED
http://health.cleeck.com/pictures/alco.jpg
http://i.imgur.com/KMs6b.jpg<br />Очень плохо, что женщины у нас зачастую востребованы в таких сферах, которые низкооплачиваемы и не требуют особых интеллектуальных затрат. 
http://imgur.com/KMs6b Это, конечно, унижает женщин и формально тоже делает их невостребованными.
http://moikompas.ru/img/compas/2008-04-29/alkogolichka/50096422_orig.jpg Но вопрос этот довольно скользкий. Движение должно быть со всех сторон. http://dirty.ru/pages/1 
Со стороны государства оно есть, со стороны женщины оно тоже должно быть. Это движение, прежде всего, к получению своего полноценного образования. http://img1.liveinternet.ru/images/attach/b/3/7/866/7866438_276bb.jpg
DEED;

//И пошли, и поехали:

$answer=pregtrim($answer);  //Ф-ция фильтрации на опасн. символы, НУЛЛ-байт и т.д.

$answer=substr($answer,0,1420);
$answer=strip_tags($answer,"<br>");

//
//Find and resize pictures

$qwant_pict preg_match_all("/http:\/\/[\w\d\/\.-_]+(.(png|jpg|gif|bmp|jpeg))/i",$answer,$pict_out);
if(
$qwant_pict>0){
    
    for(
$i=0;$i<$qwant_pict;$i++){
        
        
$pict_url=$pict_out[0][$i];
        
$pict_prov=verify_image($pict_url); //Тоже ф-ция проверки на всякую гадость в теле ссылки
        
if($pict_prov==false){ //Если ссылка на имадж "кривая", пропускаем этот цикл
            
continue;
        }
        
$size=getimagesize($pict_url);
        
        if(
$size[0]>500){ //Уменьшаем масштаб выводимой картинки
        
           
$small_height=$size[1]*500/$size[0];
           
$small_height=round($small_height);
           
$small_width=500;
        
           }
           else{
        
           
$small_height=$size[1];
           
$small_width=$size[0];
           }
        
        
        
$search[]=$pict_url;  //Набиваем найденными ссылками на картинки массив поиска

        
$replace[]="<br /><br /><img src=\"{$pict_url}\" height=\"{$small_height}\" width=\"{$small_width}\" alt=\"image\" /><br />";  //Набиваем преобразованными ссылками на картинки массив замены
       
        
    
}


    
$answer1=str_replace($search,$replace,$answer);  //Замена найденных ссылок на картинки
 
}
else{
$answer1=$answer;} //Если картинок не было в полученной из текстареи строки

//echo $answer1; Это для промежуточной проверки делал...
//exit;
//По этой не запатентованной :) пока идее, все брошенные в текстарею ссылки на изображения получили вид: <br /><img src="bla-bla..." height="..." width="..." /><br /><br />
//END of Fine and Resize Pictures
//My Links

$num_links=preg_match_all("/(?<!\")(((f|ht){1}tp://)[-a-zA-Z0-9@:%_\+.;~#?&//=]+)(?!\.(jpg|jpeg|gif|png|bmp|psd|ico)\")/Uis",$answer1,$link_out); //Поиск ссылок, не обрамленных кавычками и (на всякий пожарный) не заканчивающихся указанными расширениями
if($num_links>0){ //Если они есть, то:
    
for($i=0;$i<$num_links;$i++){
        
$click1=parse_url($link_out[0][$i]);
        
$click=$click1['host'];
        
$link=$link_out[0][$i];
        
$search[]=$link//Забиваем найденными ссылками массив поиска
        
$replace[]="<a href=\"http://www.mysite.com/out.php?link=$link\" target=\"_blank\">$click</a>"// В этом же цикле формируем соответствующую подстроку замены
       
    
}
    
    
$answer2=str_replace($search,$replace,$answer1);
    
    
}
else{
$answer2=$answer1;}
echo 
$answer2;
exit;
//End of My Links
//
/* В итоге измененная строка из текстареи должна находиться в $answer2, но... Если нет простых ссылок, картинки ПОРОЙ обрабатываются нормально, но если попадается хоть одна, начинаются траблы */
//
$text=mysql_real_escape_string($answer2);//Дальше неинтересно...

?>


А полностью скрипт, бывает, срабатывает, но только на локалке с Денвером, PHP Version 5.3.3
Я не волшебник, я только учусь © И хотел бы понять, где здесь заковыка?
P.S. Все регулярки проверял по много раз в разных приложениях. С ними, вроде, все в порядке: http://www.softtime.ru/forum/files/79797-20110327222528.gif

  Ответить  
 
 автор: cheops   (28.03.2011 в 12:21)   письмо автору
 
   для: Deed   (27.03.2011 в 22:16)
 

>В итоге измененная строка из текстареи должна находиться в $answer2, но... Если нет простых
>ссылок, картинки ПОРОЙ обрабатываются нормально, но если попадается хоть одна,
>начинаются траблы
Так, у нас есть ссылки и картинки, первые нужно подсветить, из вторых сделать картинки? Что происходит, если в тексте:
1) Одни картинки
2) Одни ссылки
3) Картинки и ссылки
А главное какого рода траблы начинаются? Что работает не так (ссылки не подсвечиваются или картинки)?

PS Вообще по уму лучше грести все ссылки в один preg_replace_callback(), а внутри него уже разбираться - кто изображение, а кто обычная ссылка.

  Ответить  
 
 автор: Deed   (28.03.2011 в 19:14)   письмо автору
 
   для: cheops   (28.03.2011 в 12:21)
 

Доброго дня, cheops!

1) Одни картинки - все работает!
2) Одни ссылки - все работает!
3) Картинки и ссылки - тег <img> корежится повтором src=" , а вот ссылки кликабельные выводятся нормально.
Да Вы можете проверить этот скрипт на локалке, он полный. И как раз на локалке у меня он работает прекрасно, но на сервере - ни в какую.

  Ответить  
 
 автор: cheops   (28.03.2011 в 19:34)   письмо автору
 
   для: Deed   (28.03.2011 в 19:14)
 

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

PS Кстати, с разницей на локальной машине и сервере тоже встречался и многие посетители форума - есть такая проблема.

  Ответить  
 
 автор: cheops   (28.03.2011 в 19:51)   письмо автору
 
   для: Deed   (28.03.2011 в 19:14)
 

Для простоты и лучшего восприятия пока убрал обработку размеров изображений (для удобства эту процедуру лучше в отдельную функцию вынести)
<?php
  
//Обработчик получает из текстареи примерно такое: 

  
$answer=<<< DEED
http://health.cleeck.com/pictures/alco.jpg 
http://i.imgur.com/KMs6b.jpg<br />Очень плохо, что женщины у нас зачастую востребованы в таких сферах, которые низкооплачиваемы и не требуют особых интеллектуальных затрат.  
http://imgur.com/KMs6b Это, конечно, унижает женщин и формально тоже делает их невостребованными. 
http://moikompas.ru/img/compas/2008-04-29/alkogolichka/50096422_orig.jpg Но вопрос этот довольно скользкий. Движение должно быть со всех сторон. http://dirty.ru/pages/1  
Со стороны государства оно есть, со стороны женщины оно тоже должно быть. Это движение, прежде всего, к получению своего полноценного образования. http://img1.liveinternet.ru/images/attach/b/3/7/866/7866438_276bb.jpg 
DEED;

  
$answer substr($answer01420); 
  
$answer strip_tags($answer"<br>"); 

  
// Обарабатываем ссылки
  
$pattern "/(?<!\")(((f|ht){1}tp:\/\/)[-a-zA-Z0-9@:%_\+.;~#?&\/=]+)/is";
  
$answer preg_replace_callback($pattern"replace"$answer);
  
// Выводим результат
  
echo $answer;
  
  function 
replace($link_out
  { 
    
// Смотрим, нет ли на конце признака изображения
    // png|jpg|gif|bmp|jpeg
    
$pattern "/(png|jpg|gif|bmp|jpeg)$/i";
    if(
preg_match($pattern$link_out[1])) {
      
// Это изображение, для простоты уберем вычисление
      // размеров
      
return "<br /><br /><img src=\"{$link_out[1]}\" alt=\"image\" /><br />";
    } else {
      
// Это обычная ссылка
      
$click parse_url($link_out[1]); 
      return 
"<a href=\"http://www.mysite.com/out.php?link={$link_out[1]}\" target=\"_blank\">{$click['host']}</a>";  
    }
  }
?>

  Ответить  
 
 автор: Deed   (29.03.2011 в 14:48)   письмо автору
 
   для: cheops   (28.03.2011 в 19:51)
 

Смотрел-смотрел я на вполне работоспособный код и недоумевал, почему он не работает... Стал писать его заново, почти строка в строку и осенило!!
Дело в том, уважаемый cheops, что во второй части этого скрипта я набивал новыми элементами уже заполненные в первой части массивы $search[] и $replace[]. Вот и все :)
Прекрасный скрипт. Я пока не принялся за изучение JavaScript, и данный код на PHP временно заменит WYSIWYG в открывающихся по клику ответах на комментарии.
Большое Вам спасибо. И посоветуйте бумажную книгу по ДжаваСкрипт с абсолютного нуля.

  Ответить  
 
 автор: cheops   (29.03.2011 в 14:57)   письмо автору
 
   для: Deed   (29.03.2011 в 14:48)
 

>И посоветуйте бумажную книгу по ДжаваСкрипт с абсолютного нуля.
Совершенно фантастическая по охвату материала книга Дэнни Гудман, Майкл Моррисон. JavaScript. Библия пользователя, мало того что более 1000 страниц, так это только половина книги, еще половина на компакт диске в виде pdf-файлов. Правда не уверен, что для начала она подходит - можно захлебнуться, я её сам от начала до конца так и не осилил, делаю время от времени набеги на разные главы.

  Ответить  
 
 автор: Deed   (29.03.2011 в 17:05)   письмо автору
 
   для: cheops   (29.03.2011 в 14:57)
 

Так и Вашу книгу «PHP в подлиннике» с наскока не осилишь :)

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

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