Я хочу заменить ссылки на изображения в тексте следующими, но это не так. Я уверен, что все правильно, но я не знаю, в чем проблема. Можете ли вы помочь мне с этой проблемой?
{#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 :)
Вы помещаете замененный текст в $str
, а затем сбрасываете исходный $text
.
@IMSoP Понятно, спасибо за помощь
Причина отсутствия совпадения заключается в том, что в шаблоне <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
. Я думаю, мне нужен холодный напиток :). Я просмотрел ваш код, и он оказался для меня полезным и поучительным. Спасибо.
Не объяснение того, почему ваша попытка не работает, но использование
preg_replace
с модификатором/g
и\1
в строке замены было бы проще, чем использованиеpreg_match_all
и цикла.