За последние 24 часа нас посетили 15238 программистов и 1762 робота. Сейчас ищут 1435 программистов ...

В тексте найти ссылку на картинку

Тема в разделе "Регулярные выражения", создана пользователем Tarasyan, 27 ноя 2016.

  1. Tarasyan

    Tarasyan Новичок

    С нами с:
    27 ноя 2016
    Сообщения:
    42
    Симпатии:
    0
    В тексте нужно найти ссылку на картинку, и взять ее в тег

    Набросал замену, но срабатывает только для статических картинок и http
    когда картинка с динамическим окончанием или по https, то не срабатывает выражение.

    PHP:
    1. $str = preg_replace("/(http:\/\/)?([a-zA-Z0-9\-.]+\.[a-zA-Z0-9\-]+([\/]([a-zA-Z0-9_\/\-.?&%=+])*)*)(\.jpeg|\.jpg|\.png|\.gif|\.bmp)/", '[img]http://$2$5[/img]', $str);
    Как сделать универсально для динамических и https ?
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    тогда все ссылки будут в картинки преобразованы, а что если там не картинка?
     
    Tarasyan нравится это.
  3. Tarasyan

    Tarasyan Новичок

    С нами с:
    27 ноя 2016
    Сообщения:
    42
    Симпатии:
    0
    Наверное нужно через функцию обрабатывать урл, проверять картинка или нет.
     
  4. Tarasyan

    Tarasyan Новичок

    С нами с:
    27 ноя 2016
    Сообщения:
    42
    Симпатии:
    0
    Набросал как с текста выдернуть ссылки в массив

    PHP:
    1. $img = '/(http|https):\/\/(.*?)(\s|\n|[,.?!](\s|\n)|$)/';
    2. preg_match_all($img, $str, $out);
    В $out[0] все ссылки с текста.

    Нужно наверное проверить все ссылки на предмет картинок через exif_imagetype и затем сравнивать и обрамлять в теги.

    Не могу найти решения ((
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    качай картинку к себе на сервер и проверяй
     
  6. Tarasyan

    Tarasyan Новичок

    С нами с:
    27 ноя 2016
    Сообщения:
    42
    Симпатии:
    0
    Поскольку в контенте будут ссылки только с картинками, пока решено

    PHP:
    1. $img = '/(http|https):\/\/(.*?)(\s|\n|[,.?!](\s|\n)|$)/';
    2. $str = preg_replace($img, '[img]$1://$2[/img]', $str);
    Позже буду разбираться с проверкой контента по ссылке.
     
  7. Tarasyan

    Tarasyan Новичок

    С нами с:
    27 ноя 2016
    Сообщения:
    42
    Симпатии:
    0
    Зачем качать к себе на сервер, если можно на "лету" проверить? Так можно какой то вирус спрятан под картинку закачать :)))

    Вот я такое набросал, если можно как то упростить еще, буду рад вашим предложениям.

    PHP:
    1. function find_img($matches)
    2. {
    3.    $a =trim($matches[0]);
    4.     if (@exif_imagetype($a) == FALSE) {
    5.        return ($matches[0]);
    6.     }
    7. else
    8. {
    9.     return ('[img]'. ($matches[0]).'[/img]');
    10. }
    11. }
    12. $img = '/(http|https):\/\/(.*?)(\s|\n|[,.?!](\s|\n)|$)/';
    13. echo preg_replace_callback($img,"find_img",$str);
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    тебе нужно было проверить файл является изображением или просто есть ли в его имени расширение изображения?
    Если в публичную папку выгружать и давать ссылку на изображение + переконвертирование может помочь
     
  9. Tarasyan

    Tarasyan Новичок

    С нами с:
    27 ноя 2016
    Сообщения:
    42
    Симпатии:
    0
    Проверить, если изображение, то обернуть в тег, если нет, то так и оставить.
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    твой код качает в оперативную память изображение по ссылки или файл локальный и уже определяет если это изображение
     
  11. Tarasyan

    Tarasyan Новичок

    С нами с:
    27 ноя 2016
    Сообщения:
    42
    Симпатии:
    0
    Это плохо??
    Разве он весь качает?

    exif_imagetype() считывает начальные байты изображения и проверяет их сигнатуру.
     
  12. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    всё нормально

    Где написано, что он качает только часть изображения?
     
  13. Tarasyan

    Tarasyan Новичок

    С нами с:
    27 ноя 2016
    Сообщения:
    42
    Симпатии:
    0
    Хз... только учусь, могу не все ппонимать ))))
    Тут вот http://www.php.net/exif_imagetype

    Если заменить на getimagesize() ?

    Что предпочтительней?
     
  14. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    качает и читает это разные вещи

    первый читает, второй пытается работать как с изображением и может определить битое или не правильное с большей вероятностью чем exif_imagetype
     
    Tarasyan нравится это.