我编写了一个PHP函数来获取具有宽度和高度的视频嵌入代码,并允许您指定新的宽度。然后,该函数将使用适当的缩放系数缩小高度。我发现宽度和高度并不总是相邻的,所以我做了几个我预感不必要的电话。是否有更好的方法/清理以下操作?
function scale_video($video_embed,$new_width = 200){
preg_match('/width="(\d)*"/', $video_embed, $width);
preg_match('/height="(\d)*"/', $video_embed, $height);
$width = substr($width[0],7,-1);
$height = substr($height[0],8,-1);
$scale_factor = $new_width/$width;
$new_height = floor($height * $scale_factor);
$video_embed = preg_replace('/width="(\d)*"/','width="'.$new_width.'"',$video_embed);
$video_embed = preg_replace('/height="(\d)*"/','height="'.$new_height.'"',$video_embed);
return $video_embed;
}
答案 0 :(得分:4)
我唯一建议的是你的正则表达式需要改进。
/width="(\d)*"/
应该是:
/width="(\d*)"/
这将为您提供所需的整个值的组,而不是模式中每个字符的组。这样你就可以改变:
$width = substr($width[0],7,-1);
到
$width = $width[1];
您也可以轻松地将其应用于身高。通过将前两个参数转换为数组,可以将结束替换转换为一个调用。
总之,我建议如下:
function scale_video($video_embed,$new_width = 200){
// only process if both matches have results
if(preg_match('/width="(\d+)"/', $video_embed, $width) &&
preg_match('/height="(\d+)"/', $video_embed, $height) {
$width = $width[1];
$height = $height[1];
$scale_factor = $new_width/$width;
$new_height = floor($height * $scale_factor);
$video_embed = preg_replace(array('/width="(\d+)"/', '/height="(\d+)"/'), array('width="'.$new_width.'"', 'height="'.$new_height.'"'), $video_embed);
}
return $video_embed;
}
答案 1 :(得分:0)
更好的方法可能是使用preg_replace_callback()
或/e
modifier(用于“ e 评估代码)进行设置,以便每个模式只进行一次正则表达式匹配,像:
$video_embed = preg_replace_callback('/width="(\d)*"/', 'scale_video_width_callback', $video_embed);
function scale_video_width_callback($match) {
// transform match and return transformed value
}