PHP Using str_replace along with preg_replace


PHP Using str_replace along with 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(这意味着大)

当我像下面一样(在preg_replace里面放一个str_replace)时,什么也没发生。我怎么能做这样的事情?

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

您将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 */
}

这样你就不必对着调制解调器吹口哨了:-) 对该正则表达式进行编程。

在返回

preg_replace时使用str_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
);

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);

如果您需要每个逗号分隔值的两个单独输出,我会编写一个模式,将完整字符串匹配和子字符串存储在每个文件中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">',
)