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

0

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

/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
    Пожалуйста, сообщите волонтерам, если их ответ неверен. Если один или несколько ответов верны, присвойте зеленую галочку ответу, который, по вашему мнению, «лучший» / «самый полезный» / и т. Д. 30% всех вопросов php в настоящее время считаются «без ответа» в Stackoverflow, поскольку они не отвечают нет зеленой галочки
Теги:
filenames
preg-replace

5 ответов

1

Вы 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 */
}

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

0

Если вам нужно два отдельных выхода из каждого значения, разделенного запятыми, я бы написал шаблон, который хранит совпадение полной строки и подстроки по обе стороны от 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">',
)
  • 0
    @ Норман, можешь подтвердить, что ты этого хочешь?
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

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

0

Использовать 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
    data-slide должен идти вместе с ним. Как и в моем вопросе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню