2009-09-09 6 views
0

J'ai écrit une fonction PHP pour prendre un code d'intégration vidéo qui a une largeur et une hauteur et vous permet de spécifier une nouvelle largeur. La fonction réduit alors la hauteur en utilisant le facteur d'échelle approprié. J'ai découvert que la largeur et la hauteur n'étaient pas toujours adjacentes, donc je fais quelques appels dont j'ai l'intuition inutile. Y a-t-il un meilleur moyen de/nettoyer ce qui suit?Optimiser regex remplacer en 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; 
} 

Répondre

4

La seule chose que je vous conseille est votre modèle regex doit être améliorée

/width="(\d)*"/ 

doit être:.Cela vous donnerait un groupe pour la valeur entière que vous recherchez, plutôt qu'un groupe par caractère dans le modèle. De cette façon, vous pouvez changer:

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

dans

$width = $width[1]; 

Vous pouvez facilement appliquer à la hauteur aussi bien. Vos remplacements de fin pourraient être transformés en un appel en faisant les deux premiers paramètres dans des tableaux.

En résumé, je suggère ce qui suit:

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

Une meilleure façon peut-être d'utiliser preg_replace_callback() ou /e modifier (pour "e code Valoriser) pour définir les choses afin que vous ne faites un match de regex par modèle, quelque chose comme:

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