Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ezequielg

[Resolvido] Expressão Regular

Recommended Posts

Olá amigos do Imasters.

 

Estou com um problema há muito tempo e depois de pesquisar bastante, resolvi abrir este post.

 

Preciso pegar um vídeo do Youtube, Vimeo, Videolog ou outras fontes e alterar os valores "width" e "height".

 

Para isso, criei a seguinte função abaixo

 

<?php
	# You Tube
	$codigo_video = '<object width="560" height="340"><param name="movie" value="http://www.youtube.com/watch?v=Q2sInhKqvJI?fs=1&hl=pt_BR"></param><param'>http://www.youtube.com/watch?v=Q2sInhKqvJI?fs=1&hl=pt_BR"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/watch?v=Q2sInhKqvJI?fs=1&hl=pt_BR" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object>';
		
	# Pegando a largura e altura do video
	preg_match_all('/(width)=("[^"]*")/i',$codigo_video, $result);
	$width	= trim($result[2][1]);
	
	preg_match_all('/(height)=("[^"]*")/i',$codigo_video, $result);
	$height	= trim($result[2][1]);
	
	# Substituindo o valor numerico por uma variavel
	$codigo_video = str_replace($width, '$largura_video', $codigo_video);
	$codigo_video = str_replace($height, '$altura_video', $codigo_video);
?>

 

A função acima funciona, porém apenas para o YouTube.

Se eu pegar um vídeo do Vimeo, já dá erro, por exemplo.

 

$codigo_video = '<iframe src="http://player.vimeo.com/video/15081749" width="400" height="225" frameborder="0"></iframe>';

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá ezequielg, tudo bem.

 

O problema estava no uso do preg_match_all que encontra todas as ocorrências da expressão regular. Assim, a sua variável $result[2][1] não servia quando o preg_match_all encontrava apenas uma ocorrência como no caso do vimeo.

 

Veja as alterção que proponho.

 

 


<?php
# You Tube
$codigo_video = '<object width="560" height="340"><param name="movie" value="http://www.youtube.com/watch?v=Q2sInhKqvJI?fs=1&hl=pt_BR"></param><param'>http://www.youtube.com/watch?v=Q2sInhKqvJI?fs=1&hl=pt_BR"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/watch?v=Q2sInhKqvJI?fs=1&hl=pt_BR" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object>';
//$codigo_video = '<iframe src="http://player.vimeo.com/video/15081749" width="400" height="225" frameborder="0"></iframe>';

// Pega a largura do video, apenas a primeira ocorrência ao contrário do preg_match_all
preg_match('/(width)=("[^"]*")/i',$codigo_video, $result);

// Do resultado por ex. width="560" , retiramos tudo que não for número
$width = preg_replace('/\D/','',$result[0]);

// Idem à largura
preg_match('/(height)=("[^"]*")/i',$codigo_video, $result);
$height = preg_replace('/\D/','',$result[0]);

// Valores arbitrários, apenas para teste
$largura_video = "120";
$altura_video = "140";

// Substitue os valores
$codigo_video = str_replace("width=\"".$width."\"", "width=\"".$largura_video."\"", $codigo_video);
$codigo_video = str_replace("height=\"".$height."\"", "height=\"".$altura_video."\"", $codigo_video);
	
echo $codigo_video;
	
?>

 

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, Muito Obrigado!

 

Funcionou que é uma maravilha.

 

Só preciso fazer mais dois ajustes.

 

Atualmente ele está alterando o valor de width="400", mas se for com aspas simples, não altera, exemplo: width='400'.

Também gostaria que alterasse caso não houver aspas, exemplo: width=400

 

 

Irei usar este código em uma função para manipular URLs de vídeos e como o usuário pode pegar vídeo de vários sites, estas situações acabam acontecendo.

 

 

Vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá ezequielg, tudo bem.

 

Testa esse aí.

 

 



//$codigo_video = '<object width="560" height="340"><param name="movie" value="http://www.youtube.com/watch?v=Q2sInhKqvJI?fs=1&hl=pt_BR"></param><param'>http://www.youtube.com/watch?v=Q2sInhKqvJI?fs=1&hl=pt_BR"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/watch?v=Q2sInhKqvJI?fs=1&hl=pt_BR" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object>';

$codigo_video = '<iframe src="http://player.vimeo.com/video/15081749" width="400" height="225" frameborder="0"></iframe>';


// Pega a largura do video
preg_match("/(width=)+[\"']?+[0-9]*+[\"']?/i",$codigo_video, $result);

// Do resultado por ex. width="560" , retiramos tudo que não for número
$width = preg_replace('/\D/','',$result[0]);

// Idem à largura
preg_match("/(height=)+[\"']?+[0-9]*+[\"']?/i",$codigo_video, $result);
$height = preg_replace('/\D/','',$result[0]);

// Valores arbitrários, apenas para teste
$largura_video = "220";
$altura_video = "180";

// Substitue os valores
$codigo_video = preg_replace("/(width=)+[\"']?+[0-9]*+[\"']?/i", "width=\"".$largura_video."\"", $codigo_video);
$codigo_video = preg_replace("/(height=)+[\"']?+[0-9]*+[\"']?/i", "height=\"".$altura_video."\"", $codigo_video);
	
echo $codigo_video;

 

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fera, valeu mesmo.

 

Ficou uma maravilha.

 

Abaixo estou postando todo o código novamente em forma de função para quem precisar.

 

<?php

	function VideoEmbed($codigo_video, $nova_largura, $nova_altura)
	{
		# Pega a largura do video, apenas a primeira ocorrencia ao contrário do preg_match_all
		# A largura deve estar em um destes formatos: width="500" ou width='500' ou width=500
		preg_match("/(width=)+[\"']?+[0-9]*+[\"']?/i",$codigo_video, $result);
		# Retiramos, do resultado, tudo que nao for número
		$width = preg_replace('/\D/','',$result[0]);
		
		# Pega a altura do video, apenas a primeira ocorrencia ao contrário do preg_match_all
		# A altura deve estar em um destes formatos: height="500" ou height='500' ou height=500
		preg_match("/(height=)+[\"']?+[0-9]*+[\"']?/i",$codigo_video, $result);
		# Retiramos, do resultado, tudo que nao for número
		$height = preg_replace('/\D/','',$result[0]);

		# Substitue os valores
		$codigo_video = preg_replace("/(width=)+[\"']?+[0-9]*+[\"']?/i", "width=\"".$nova_largura."\"", $codigo_video);
		$codigo_video = preg_replace("/(height=)+[\"']?+[0-9]*+[\"']?/i", "height=\"".$nova_altura."\"", $codigo_video);
			
		return $codigo_video;
	}
	
	
	$youtube = '<object width="560" height=340><param name="movie" value="http://www.youtube.com/watch?v=Re40Ix9JHbY?fs=1&hl=pt_BR"></param><param'>http://www.youtube.com/watch?v=Re40Ix9JHbY?fs=1&hl=pt_BR"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/watch?v=Re40Ix9JHbY?fs=1&hl=pt_BR" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width=560 height="340"></embed></object>';

	$codigo_video = VideoEmbed($youtube, 300, 250);
	
	echo $codigo_video;
	
?>

 

Esse negócio de Expressão Regular é ótimo.

O que significa este trecho do código? "/(width=)+[\"']?+[0-9]*+[\"']?/i"

 

Se tiver alguns tutoriais de expressão regular, favor passar, quero estudar esse assunto pois é poderoso.

 

Abraços e Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá ezequielg, tudo bem.

 

As expressões anteriores, que fiz, estão com alguns erros crassos. Esses sinais de adição e os parênteses não tem razão para estar aí. Troque as expressões por estas aqui embaixo:

 

 


"/width[\s]*=[\s]*[\"']?[0-9]+[\"']?/i"

"/height[\s]*=[\s]*[\"']?[0-9]+[\"']?/i"

 

Breve explicação:

 

"/width[\s]*=[\s]*[\"']?[0-9]+[\"']?/i"

 

 

"/ - Delimita a expressão;

width - Indica que quero exatamente a palavra width;

[\s]* - Indica que pode ser zero ou mais espaços em branco;

[\"']? - Indica que pode ser zero ou uma aspas simples ou dupla, a aspas dupla, neste caso, está escapada pois ela também está sendo usada para delimitar a expressão;

[0-9]+ - Indica que pode ser um ou mais números de 0 a 9;

[\"']? - Idem ao anterior;

/i" - Delimita a expressão, o modificador i indica que o quê procuro pode estar tanto em maiúscula quanto minúscula.

 

 

 

Algum material para estudo:

 

http://lawrence.ecorp.net/inet/samples/regexp-intro.php

http://imasters.com.br/artigo/2515/javascript/regular_expression/

 

 

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, muito obrigado!

 

Ficou perfeito!

 

Obrigado também pelas pelos links e pela explicação.

Vou estudá-los com certeza.

Me interessei muito por Expressões Regulares.

 

Abraços e Sucesso!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue abaixo o código final com todas as alterações comentadas neste post.

 

Façam bom proveito.

 

<?php

        function VideoEmbed($codigo_video, $nova_largura, $nova_altura)
        {
                # Pega a largura do video, apenas a primeira ocorrencia ao contrário do preg_match_all
                # A largura deve estar em um destes formatos: width="500" ou width='500' ou width=500
                preg_match("/width[\s]*=[\s]*[\"']?[0-9]+[\"']?/i",$codigo_video, $result);
                # Retiramos, do resultado, tudo que nao for número
                $width = preg_replace('/\D/','',$result[0]);
                
                # Pega a altura do video, apenas a primeira ocorrencia ao contrário do preg_match_all
                # A altura deve estar em um destes formatos: height="500" ou height='500' ou height=500
                preg_match("/height[\s]*=[\s]*[\"']?[0-9]+[\"']?/i",$codigo_video, $result);
                # Retiramos, do resultado, tudo que nao for número
                $height = preg_replace('/\D/','',$result[0]);

                # Substitue os valores
                $codigo_video = preg_replace("/width[\s]*=[\s]*[\"']?[0-9]+[\"']?/i", "width=\"".$nova_largura."\"", $codigo_video);
                $codigo_video = preg_replace("/height[\s]*=[\s]*[\"']?[0-9]+[\"']?/i", "height=\"".$nova_altura."\"", $codigo_video);
                        
                return $codigo_video;
        }
        
        
        $youtube = '<object width="480" height="385"><param name="movie" value="http://www.youtube.com/watch?v=KWABDpgziIY?fs=1&hl=pt_BR"></param><param'>http://www.youtube.com/watch?v=KWABDpgziIY?fs=1&hl=pt_BR"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/watch?v=KWABDpgziIY?fs=1&hl=pt_BR" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>';

        $codigo_video = VideoEmbed($youtube, 300, 250);
        
        echo $codigo_video;
        
?>

Abraços,

Ezequiel

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.