regex — 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)

0

Решение

Вы кладете 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 */
}

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

1

Другие решения

использование 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">
0

использование 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
);

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

0

На самом деле ваш 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);
0

Если вам нужно два отдельных вывода для каждого значения, разделенного запятыми, я бы написал шаблон, в котором хранится совпадение полной строки и подстрок с каждой стороны m в каждом файле.

* примечание: я соответствую трейлингу - в первой группе захвата и ведущих . во второй группе захвата для минимальной гарантии точности. Это несколько слабая проверка; Вы можете подтвердить это, если ваш проект требует этого, добавив буквенные или более ограничительные компоненты шаблона в группы захвата.

Код: (демонстрация)

$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">',
)
0
По вопросам рекламы [email protected]