我有一串逗号分隔的值来自数据库,实际上是图像路径。这样:
/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 "nn";
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">',
)