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)


person Norman    schedule 31.01.2015    source источник
comment
Пожалуйста, сообщите волонтерам, если их ответ неверен. Если один или несколько ответов верны, отметьте зеленой галочкой ответ, который вы считаете лучшим/наиболее полезным/и т. д. 30% всех вопросов php в настоящее время считаются без ответа в Stackoverflow, потому что у них нет зеленой галочки .   -  person mickmackusa    schedule 13.02.2018


Ответы (5)


Вы помещаете вызов 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 */
}

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

person O. Jones    schedule 31.01.2015

Используйте 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">
person Saqueib    schedule 31.01.2015
comment
data-slide должен идти с ним. Как в моем вопросе. - person Norman; 31.01.2015

Используйте 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() получает в качестве второго аргумента функцию, которая получает список совпадающих выражений и возвращает строку замены.

person axiac    schedule 31.01.2015

На самом деле ваш 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);
person Kuba Wyrostek    schedule 31.01.2015

Если вам нужны два отдельных вывода для каждого значения, разделенного запятыми, я бы написал шаблон, который сохраняет полное соответствие строки и подстроки по обе стороны от 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">',
)
person mickmackusa    schedule 05.02.2018