У меня есть строка разделенных запятыми значений, которые поступают из базы данных, которые на самом деле являются путями изображений. Вот так:
/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 */
}
Таким образом, вам не нужно свистеть в ваш модем :-), чтобы запрограммировать это регулярное выражение.
Если вам нужно два отдельных выхода из каждого значения, разделенного запятыми, я бы написал шаблон, который хранит совпадение полной строки и подстроки по обе стороны от m
в каждом файле.
* note: Я сопоставляю трейлинг -
первую группу захвата и ведущую .
во второй группе захвата для минимальной уверенности в точности. Это несколько слабая проверка; вы можете утвердить его, если ваш проект требует его, добавив в группы захвата литературные или более ограничительные шаблонные компоненты.
Код: (Демо)
$csv='/images/us/US01021422717777-m.jpg,/images/us/US01021422717780-m.jpg,/images/us/US01021422717782-m.jpg,/images/us/US01021422718486-m.jpg';
if(preg_match_all('~([^,]+-)m(\.[^,]+)~',$csv,$out,PREG_SET_ORDER)){
foreach($out as $m){
$mediums[]="<img class=\"gallery\" src=\"{$m[0]}\">";
$larges[]="<img class=\"gallery\" src=\"{$m[0]}\" data-slide=\"{$m[1]}l{$m[2]}\">";
}
}
var_export($mediums);
echo "\n\n";
var_export($larges);
Вывод:
array (
0 => '<img class="gallery" src="/images/us/US01021422717777-m.jpg">',
1 => '<img class="gallery" src="/images/us/US01021422717780-m.jpg">',
2 => '<img class="gallery" src="/images/us/US01021422717782-m.jpg">',
3 => '<img class="gallery" src="/images/us/US01021422718486-m.jpg">',
)
array (
0 => '<img class="gallery" src="/images/us/US01021422717777-m.jpg" data-slide="/images/us/US01021422717777-l.jpg">',
1 => '<img class="gallery" src="/images/us/US01021422717780-m.jpg" data-slide="/images/us/US01021422717780-l.jpg">',
2 => '<img class="gallery" src="/images/us/US01021422717782-m.jpg" data-slide="/images/us/US01021422717782-l.jpg">',
3 => '<img class="gallery" src="/images/us/US01021422718486-m.jpg" data-slide="/images/us/US01021422718486-l.jpg">',
)
На самом деле ваша 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);
Используйте 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
$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">
data-slide
должен идти вместе с ним. Как и в моем вопросе.