在PHP中优化正则表达式替换

时间:2009-09-09 17:21:36

标签: php regex string

我编写了一个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;
}

2 个答案:

答案 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
}