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(这意味着大)

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

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

4

5 回答 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 */
}

这样你就不必对你的调制解调器吹口哨:-) 来编程那个正则表达式。

于 2015-01-31T17:33:21.973 回答
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">
于 2015-01-31T17:31:00.513 回答
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()获取一个函数作为其第二个参数,该函数接收匹配的表达式列表并返回替换字符串。

于 2015-01-31T17:32:35.600 回答
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);
于 2015-01-31T17:34:11.017 回答
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">',
)
于 2018-02-05T03:14:36.867 回答