Regex PHP yerini optimize

2 Cevap php

Ben genişlik ve yüksekliğe sahip bir video embed kodunu almak ve yeni bir genişliğini belirtmek için izin için bir PHP işlevi yazdım. Işlevi daha sonra uygun ölçeklendirme faktörü kullanılarak yüksekliğini aşağı dönüşebilecek. Ben bu yüzden ben bir his var aramaların bir çift gereksiz hale genişlik ve yüksekliği daima bitişik olmadığını keşfetti. / Aşağıdakileri yapın temizlemek için daha iyi bir yolu var mı?

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 Cevap

Ben tavsiye ediyorum tek şey regex desen geliştirilmelidir olduğunu.

/width="(\d)*"/

Olmalı:

/width="(\d*)"/

Bu size aradığınız tüm değer yerine, desen, karakter başına bir grup için bir grup verecekti. Bu şekilde daha sonra değiştirebilirsiniz:

$width = substr($width[0],7,-1);

içine

$width = $width[1];

You can easily apply this to height as well. Your ending replacements could be turned içine one call by making the first two parameters içine arrays.

Özetle, ben şu öneririm:

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

Daha iyi bir yol sadece desen başına bir regex maç yapmak, böylece bir şey gibi, bir şeyler kurmak için preg_replace_callback() or the /e değiştirici (for "e kodunu değerleme) kullanmak olabilir:

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