Ir para conteúdo

POWERED BY:

Arquivado

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

Guilherme Oderdenge

[Resolvido] Vídeo do Youtube exibindo a URL

Recommended Posts

Olá!

 

Tenho a seguinte função (esta converte links em vídeos [do Youtube]):

function callYoutube( $var ){
        if ( preg_match_all( '#(youtube.com)?/(v/([-|~_0-9A-Za-z]+)|watch\?v\=([-|~_0-9A-Za-z]+)&?.*?)#i', $var, $matches ) ){
            foreach( $matches[4] AS $videoID ) {
                $vidID = $matches[4][0];
                list ($id) = split(" ", $videoID, 5);
                echo '<iframe width="560" height="349" wmode="transparent" frameborder="no" src="http://www.youtube.com/embed/' . $id . '" frameborder="" allowfullscreen></iframe>';
            } echo $var;
        } else {
            return $var;
        }
}

 

Tenho o seguinte script que chama um post do banco e aplica a função acima:

    <div id="conteudo">
        <?php echo callYoutube($exibir_conteudo); ?>
    </div>

 

Beleza. Tudo funciona normal, a menos que:

  • Na função, como podem ver, eu dou um echo no parâmetro $var para exibir o post junto com o vídeo, no entanto, isso faz o link do vídeo se repetir. Quase dá certo, se não pelo fato de junto com o vídeo, o link do mesmo estar sendo exibido;
  • Se eu não retornar o parâmetro $var junto com o vídeo e inserir um link do Youtube, exibe apenas o vídeo, e não a continuidade do post;

Para estes casos, o que se pode fazer?

 

Desde já, grato.

 

Abraços! ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

-------------------------------------------

EDIT (era pra ter editado, whatever)

 

Galera, prossegui um pouco, mas nada tão significativo assim. Consegui "eliminar" parcialmente a URL do vídeo no Post, no entanto, se eu tenho mais de um víde no mesmo post, ele só exibe o primeiro. Vejam as modificações:

function callYoutube( $var ){
        if ( preg_match_all( '#(youtube.com)?/(v/([-|~_0-9A-Za-z]+)|watch\?v\=([-|~_0-9A-Za-z]+)&?.*?)#i', $var, $matches ) ){
            foreach( $matches[4] AS $videoID ) {
                $vidID = $matches[4][0];
                list ($id) = split(" ", $videoID, 5);
                $retorno = '<iframe width="560" height="349" wmode="transparent" frameborder="no" src="http://www.youtube.com/embed/' . $id . '" frameborder="" allowfullscreen></iframe>';
                $pageContent = preg_replace("#(http://www.youtube.com)?/(v/([-|~_0-9A-Za-z]+)|watch\?v\=([-|~_0-9A-Za-z]+)&?.*?)#i", $retorno, $var);
            } echo $pageContent;
        } else {
            return $var;
        }
}

 

------------------------

EDIT 2

------------------------

 

Se eu adicionar a um echo com a variável $pageContent dentro do Foreach, exibe duas vezes cada vídeo (estou debugando aqui, e no meu caso tenho dois vídeos).

 

Então, penso eu que a solução não está muito longe do meu alcance, só ainda não consegui farejá-la.

 

------------------------

EDIT 3

------------------------

 

Consegui dar mais um passo!

 

Vejam:

function callYoutube( $var ){
        if ( preg_match_all( '#(youtube.com)?/(v/([-|~_0-9A-Za-z]+)|watch\?v\=([-|~_0-9A-Za-z]+)&?.*?)#i', $var, $matches ) ){
            foreach( $matches[4] AS $videoID ) {
                $vidID = $matches[4][0];
                list ($id) = split(" ", $videoID, 5);
                $retorno = '<iframe width="560" height="349" wmode="transparent" frameborder="no" src="http://www.youtube.com/embed/' . $id . '" frameborder="" allowfullscreen></iframe>';
                echo $retorno;
            }
        $pageContent = preg_replace("#(http://www.youtube.com)?/(v/([-|~_0-9A-Za-z]+)|watch\?v\=([-|~_0-9A-Za-z&;]+)&?.*?)#i", "", $var);
        echo $pageContent;
        } else {
            return $var;
        }
}

 

Ele está fazendo o que eu quero. Tira as URL's do Youtube do post normal e exibe os vídeos do Youtube.

 

Mas como podem ver, o "echo $pageContent;" que é onde é exibido o conteúdo, ele fica sempre embaixo dos vídeos, independente se os vídeos fiquem embaixo do conteúdo. E no preg_replace, não utilizei nada para substituir os links, e esse "nada" fez uma linha quebrar - como se tivesse um '<br/>'.

 

Saberiam, finalmente, me guiar da maneira certa? Estou fazendo o impossível, de verdade.

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Guilherme,

<?php
echo '<pre>';
function callYoutube( $var ){
        if( !is_null( $var ) ){
            preg_match_all( '/(http:\/\/(www\.)?youtube.com)?\/(v\/([-|~_0-9A-Za-z]+)|watch\?v\=([-|~_0-9A-Za-z]+).*)/', $var, $videos );
     foreach( $videos[ 5 ] as $video ){
                $frame[] = sprintf( '<iframe width="560" height="349" src="http://www.youtube.com/embed/%s"></iframe>', $video );
            }
            return str_replace( $videos[ 0 ], $frame, $var );
        }
}
$texto = <<<Texto
Olá, Brasil.
Vamos testar o conteúdo, com quebra de linha e com vídeos!

http://www.youtube.com/watch?v=84R4rjsNJRY
http://www.youtube.com/watch?v=sDPJ-o1leAw

Vídeos bacanas ein?

Vejam mais esse:
http://www.youtube.com/watch?v=TVqe8ieqz10&feature=relmfu

E esse:
http://www.youtube.com/watch?v=0QRO3gKj3qw&feature=relmfu

Abraços!

Texto;

echo callYoutube( $texto );

 

Saída:

andrey@andrey:~$ php -f /var/www/index.php
<pre>Olá, Brasil.
Vamos testar o conteúdo, com quebra de linha e com vídeos!

<iframe width="560" height="349" src="http://www.youtube.com/embed/84R4rjsNJRY"></iframe>
<iframe width="560" height="349" src="http://www.youtube.com/embed/sDPJ-o1leAw"></iframe>

Vídeos bacanas ein?

Vejam mais esse:
<iframe width="560" height="349" src="http://www.youtube.com/embed/TVqe8ieqz10"></iframe>

E esse:
<iframe width="560" height="349" src="http://www.youtube.com/embed/0QRO3gKj3qw"></iframe>

Abraços!
andrey@andrey:~$ 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu tinha visto o tópico essa madrugada, mas acabei me ocupando com uns problemas aqui, e não pude responder na hora, mas gostaria muito de contribuir também.

Acho que podemos tirar esse looping e utilizar a função nativa replace. Além disso o youtube antigamente utilizava (ou ainda utiliza? não sei...) o prefixo br. ao invés de www, para selecionar a região. Deixei a ER mais abrangente nesse sentido.

Segue um exemplo da minha adaptação (diminui o tamanho dos iframes propositalmente): http://matheustavares.com.br/youtube/

 

<?php
function callYoutube( $var ){
$before = '/(http:\/\/(www\.|br\.)?|www\.|br\.)youtube\.com\/[^\s]*(v\/|\?v=)([^&?\/\s]{5,15})[^\s]*/';
$after = '<iframe width="260" height="149" src="http://www.youtube.com/embed/\4"></iframe>';
return preg_replace( $before , $after , $var );
}

echo '<pre>';
$texto = <<<Texto
Olá, Brasil.
Vamos testar o conteúdo, com quebra de linha e com vídeos!

http://www.youtube.com/watch?v=84R4rjsNJRY
http://br.youtube.com/watch?v=NIqSDyMALsk&feature=related
http://br.youtube.com/v/sDPJ-o1leAw

Vídeos bacanas ein?

Vejam mais esse:
http://www.youtube.com/watch?v=TVqe8ieqz10&feature=relmfu

E esse:
http://www.youtube.com/watch?v=0QRO3gKj3qw&feature=relmfu

Abraços!

Texto;

echo callYoutube( $texto );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Matheus.

Eu vi você no tópico pela madrugada, estava até empolgado que você responderia naquela hora, mas não deu... hauehaue :P

 

Pois bem, com a sua função, os dois primeiros vídeos não foram exibidos. Tenho certeza que implementei corretamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Pois bem, com a sua função, os dois primeiros vídeos não foram exibidos.

Quais dois primeiros vídeos? Aqui rodou os 5 no exemplo do meu post: http://matheustavares.com.br/youtube/

 

Os links usados foram:

http://www.youtube.com/watch?v=84R4rjsNJRY
http://br.youtube.com/watch?v=NIqSDyMALsk&feature=related
http://br.youtube.com/v/sDPJ-o1leAw
http://www.youtube.com/watch?v=TVqe8ieqz10&feature=relmfu
http://www.youtube.com/watch?v=0QRO3gKj3qw&feature=relmfu

 

Se tiver algum link não funcionando, me passe que eu altero a ER a fins de corrigir isso, mas eu acho que está OK sim.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá de novo, Matheus.

 

Seguinte, os links que não foram exibidos são:

http:/­/www.youtube.com/watch?v=84R4rjsNJRY
http:/­/www.youtube.com/watch?v=sDPJ-o1leAw

 

E depois de cada vídeo, apareceu um "/>"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lá vai: http://matheustavares.com.br/youtube/index2.php

 

Script:

<?php
function callYoutube( $var ){
$before = '/(http:\/\/(www\.|br\.)?|www\.|br\.)youtube\.com\/[^\s]*(v\/|\?v=)([^&?\/\s]{5,15})[^\s]*/';
$after = '<iframe width="260" height="149" src="http://www.youtube.com/embed/\4"></iframe>';
return preg_replace( $before , $after , $var );
}
$texto = '
http://www.youtube.com/watch?v=84R4rjsNJRY
http://www.youtube.com/watch?v=sDPJ-o1leAw
';
echo nl2br( callYoutube( $texto ) );

 

A vantagem está no fato de não usar loopings. A performance é levemente beneficiada. :joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

E aí, Matheus.

Obrigado pela atenção, cara. Mas de novo deu aquele probleminha. O post tem 4 vídeos e os dois primeiros (foi os que eu citei) estão dando pau.

 

Além do mais, estou usando htmlentities para 'apresentar' o post, não sei se influencia ou não, mas te dou essa certeza.

 

E Matheus, sei que sua intenção é a melhor, mas nem precisa se estressar mais, aquele outro jeito está ok, embora nem todas URL's ele esteja pegando. E por falar nisso, vou tentar com a sua ER. =P

 

Edit

 

Fui testar com a sua ER, e é justamente ela quem está dando problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites
E Matheus, sei que sua intenção é a melhor, mas nem precisa se estressar mais

 

Tranquilo... mas fiquei intrigado do por quê de não estar funcionando aí. Provavelmente é relacionado à codificação dos caracteres.

Digo isso pois logo que copiei as duas URLs que você colou, deu problemas na REGEX, que foram corrigidos no simples sobrescrever da palavra "http://".

 

Só me confirma uma coisa: na minha página de exemplo está tudo OK para você, né? O problema está no transcrever para o seu ambiente, isso?

 

Um abraço!

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.