PHP使用str_replace和preg_replace

时间:2015-01-31 17:21:58

标签: php regex preg-replace filenames image-file

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

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

5 个答案:

答案 0 :(得分: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 */
}

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

答案 1 :(得分: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">

答案 2 :(得分: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()不是替换表达式,而是将第二个参数作为接收匹配表达式列表并返回替换字符串的函数。

答案 3 :(得分:0)

实际上,在调用 str_replace之前,只需调用<{1}} 。然后preg_replace的结果作为参数传递给str_replace

我的建议是使用preg_replace

preg_replace_callback

答案 4 :(得分: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">',
)