代码之家  ›  专栏  ›  技术社区  ›  easement

在PHP中优化regex replace

  •  0
  • easement  · 技术社区  · 15 年前

    我编写了一个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 回复  |  直到 11 年前
        1
  •  4
  •   Robert K    15 年前

    我唯一建议的是您的regex模式需要改进。

    /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;
    }
    
        2
  •  0
  •   chaos    15 年前

    更好的方法可能是使用 preg_replace_callback() /e modifier (为了) e 对代码进行评估)设置,以便每个模式只匹配一个regex,例如:

    $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
    }