Изменение ссылок на изображения в тексте [PHP]

Я хочу заменить ссылки на изображения в тексте следующими, но это не так. Я уверен, что все правильно, но я не знаю, в чем проблема. Можете ли вы помочь мне с этой проблемой?

{#img='image_name.jpg', alt=''}

PHP-код:

$text = "Hello <img src='https://example.com/image1.jpg'> , <img src='example.com/image2.jpg'> and now you :)";
    $re = '/<img.*?src=[\'"]([^"\'])[\'"]>/'; 
    preg_match_all($re, $text, $matches, PREG_SET_ORDER, 0);
    foreach ($matches as $val) {
        $str = preg_replace('/<img.*?src=[\'"](' . $val[1] . ')[\'"]>/', "{#img='" . $val[1] . "', alt=''}", $text);
    }
    var_dump($text);

Результат:

Hello <img src='https://example.com/image1.jpg'> , <img src='https://example.com/image2.jpg'> and now you :)

Не объяснение того, почему ваша попытка не работает, но использование preg_replace с модификатором /g и \1 в строке замены было бы проще, чем использование preg_match_all и цикла.

IMSoP 20.03.2022 20:52

Вы помещаете замененный текст в $str, а затем сбрасываете исходный $text.

KIKO Software 20.03.2022 20:53

@IMSoP Понятно, спасибо за помощь

Emre6 20.03.2022 21:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Причина отсутствия совпадения заключается в том, что в шаблоне <img.*?src=[\'"]([^"\'])[\'"]> вам нужно повторить класс символов ([^"\']*), потому что теперь вы соответствуете ровно 1 вхождению.

Затем в цикле foreach замененная строка находится в переменной $str, потому что $text вообще не трогается, передается только в preg_match_all.

Но вам не нужно сначала сопоставлять, а затем делать цикл, вызывающий preg_replace отдельно.

Например, вы можете использовать только preg_replace и использовать значение группы захвата 2, которое содержит URL-адрес для замены.

$text = "Hello <img src='https://example.com/image1.jpg'> , <img src='example.com/image2.jpg'> and now you :)";
$str = preg_replace('/<img[^>]*src=([\'"])(.*?)\1>/', "{#img='$2', alt=''}", $text);

echo $str;

Выход

Hello {#img='https://example.com/image1.jpg', alt=''} , {#img='example.com/image2.jpg', alt=''} and now you :)

См. демонстрация регулярных выражений для совпадений в regex101 и демонстрация PHP на 3v4l.org.

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

Emre6 20.03.2022 21:38

Другие вопросы по теме