Intereting Posts
Подключение к внешнему веб-сайту с помощью PHP MySQL сортируется по определенному списку В PHP, как я могу добавить 3 месяца к дате покупки, полученной из квитанции iPhone InApp? Mcrypt установлен, но не отображается в PHPINFO CkEditor, Как добавить дополнительный пункт меню в правом клике? Поменять местами, чтобы установить флажок после проверки флажка Разделить массив с массивом array_chunk динамически на основе другого массива Используя PHP с TCPDF для извлечения данных (используя mysql) из базы данных и показывая их как .pdf-файл php exec, как видеть прогресс Как отобразить изображение из mysql blob json_decode для пользовательского класса Временная метка между Javascript и PHP Как разрешить доступ только к моей базе данных MySQL из приложения iOS? (Использование webapp в качестве шлюза для db) Лучший способ избежать отправки из-за обновления страницы В PHP / MySQL следует открыть несколько соединений с базой данных или поделиться 1?

PHP Использование str_replace вместе с preg_replace

У меня есть строка разделенных запятыми значений, которые поступают из базы данных, которые на самом деле являются путями изображений. Вот так:

/images/us/US01021422717777-m.jpg,/images/us/US01021422717780-m.jpg,/images/us/US01021422717782-m.jpg,/images/us/US01021422718486-m.jpg

Затем я делаю, как показано ниже, чтобы разделить их на и преобразовать их в пути для веб-страницы.

preg_replace('~\s?([^\s,]+)\s?(?:,|$)~','<img class="gallery" src="$1">', $a)

Хорошо работает, но в одном месте дальше на моей странице мне нужно изменить -m на -l (что означает большой)

Когда мне нравится ниже (ставьте str_replace внутри preg_replace), ничего не происходит. Как я могу сделать что-то подобное?

preg_replace('~\s?([^\s,]+)\s?(?:,|$)~','<img class="gallery" src="$1" data-slide="'.str_replace('-m','-l','$1').'">', $a)

Вы str_replace() вызов str_replace() в шаблон вывода для preg_replace() . Это означает, что preg_replace() обрабатывает его как литерал.

То, что вы хотите, это примерно так:

 $imgtag = preg_replace(match, replacement, $a); $imgtag = str_replace('-m','-l',$imgtag); 

Но, на мой взгляд, было бы безопаснее и проще отлаживать этот материал, если вы изменили порядок своих замещающих операций, примерно так:

 foreach ($path in explode(",", $a)) { $path = str_replace('-m','-l',$path); $imgtag= sprintf ('<img class="gallery" src="%s">', $path); /* do something with the $imgtag */ } 

Таким образом, вам не нужно свистеть в ваш модем :-), чтобы запрограммировать это регулярное выражение.

Использовать str_replace при preg_replace

 $large = str_replace('-m','-l', preg_replace('~\s?([^\s,]+)\s?(?:,|$)~','<img class="gallery" src="$1">', $a)); 

Выход будет

 <img class="gallery" src="/images/us/US01021422717777-l.jpg"> <img class="gallery" src="/images/us/US01021422717780-l.jpg"> <img class="gallery" src="/images/us/US01021422717782-l.jpg"> <img class="gallery" src="/images/us/US01021422718486-l.jpg"> 

Используйте preg_replace_callback() :

 preg_replace_callback( '~\s?([^\s,]+)\s?(?:,|$)~', function (array $matches) { $src = $matches[1]; // this is "$1" $slide = str_replace('-m', '-l', $matches[1]); return '<img class="gallery" src="'.$src.'" data-slide="'.$slide.'">'; }, $a ); 

Вместо выражения replace, preg_replace_callback() получает в качестве второго аргумента функцию, которая получает список согласованных выражений и возвращает заменяющую строку.

На самом деле ваша str_replace просто вызывается перед preg_replace . Результат str_replace затем передается как аргумент preg_replace .

Я мог бы предложить использовать preg_replace_callback :

 function replace_img($match) { return '<img class="gallery" src="' . $match[1] . '" data-slide="' . str_replace('-m','-l',$match[1]) . '">'; } preg_replace_callback('~\s?([^\s,]+)\s?(?:,|$)~','replace_img', $a);