PHP使用str_replace和preg_replace

问题描述 投票:0回答:5

我有一串逗号分隔值来自数据库,实际上是图像路径。像这样:

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

php regex preg-replace filenames image-file
5个回答
1
投票

你将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
投票

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两侧的全字符串匹配和子串。

*注意:我匹配第一个捕获组中的尾随-和第二个捕获组中的前导.,以确保准确性的最小化。这有点微弱的验证;如果您的项目需要它,可以通过在捕获组中添加文字或更严格的模式组件来确定它。

代码:(Demo

$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">',
)
© www.soinside.com 2019 - 2024. All rights reserved.