Оптимизировать регулярные выражения заменить в PHP - PullRequest
0 голосов
/ 09 сентября 2009

Я написал функцию 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 ]

4 голосов
/ 09 сентября 2009

Единственное, что я бы посоветовал, - это улучшить ваш шаблон регулярных выражений.

/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;
}
0 голосов
/ 09 сентября 2009

Лучшим способом может быть использование preg_replace_callback() или /e модификатора (для " 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...