Ir para conteúdo

Arquivado

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

Cazzeri

Cortar uma string (link youtube)

Recommended Posts

Boa tarde,

 

Digamos que eu receba como valor o link do youtube "youtube.com/watch?v=wRLDED03fPQ"... como ficaria uma função que corte apenas a parte da ID do vídeo, que seria o valor depois do v= wRLDED03fPQ, e retornar apenas esse pedaço.

 

Já ouvi falar do explode e do split... alguém tem alguma ideia de como fazer?

 

Valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

É só usar substr()

$link = 'youtube.com/watch?v=wRLDED03fPQ';
$id = substr($link, 20); // Pega tudo a partir do 21º caractere

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah boaa... vou testar. Valeu Massaki.


Isso aí... só uma coisa, se souber responder... não existe uma função nativa que conte quantos caracteres tem na string? Só para validar caso ele coloque só .com (32) e se for .com.br (35).

Vou dar uma pesquisada ;)

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como o Massaki boto e uma das opções.

Já que youtube como você de de referencia, o id do video e sempre depois do sinal da igualdade(=) você pode da um explode.

<?php
$link = 'youtube.com/watch?v=wRLDED03fPQ';
$id = explode('=', $link);

echo $id[1];
?>

o echo $id[1]; ele pega que se refere a wRLDED03fPQ eo $id[0]; se refere a youtube.com/watch?v

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os três funcionam perfeitamente, tanto o substr (Massaki), o explode (Gleyson) e o parse_url/parse_str (Diogo). O único que compromete mesmo é o substr. Pq o cara pode colocar tanto http:// quanto http://www... ou nada, só youtube.com/... "estragando" a contagem.

 

Valeu gurizada pelas dicas.

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

 

Criei uma classe que faz o envio de vídeos do youtube e vimeo.

vou colocar a ideia de uso.

<?php

$urlVideoYoutube = "http://www.youtube.com/watch?v=d7HahF30vH4";


$Embed = ( strstr($urlVideoYoutube, 'https') ? substr($urlVideoYoutube, 32, 11) : substr($urlVideoYoutube, 31, 11) );
$youtube = get_meta_tags('http://www.youtube.com/watch?v=' . $Embed);


dentro da $youtube a mesma virou um array com as informações básica para uso, poderá dar um var_dump($youtube); e saber tudo que pode fazer com a mesma.

 

Solucionou seu problema, marque como resolvido e me der um ponto positivo de reputação.

 

 

Att: João Paulo - Desenvolvedor

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vocês ainda estão nessa é?

 

Não adianta tratar URL com funções do php que foram criadas para outros propositos, é como tentar usar expressão regular para trabalhar com DOM.

 

Se me permite, eu diria que se quer realmente algo confiável, vai ter que observar o que o PHP fez para resolver esse problema.

 

Se me permite mostrar um exemplo, eu faria algo assim.

 

AbstractVideoUrl.php

<?php

// Strategy

abstract class AbstractVideoUrl
{
    private $url = '';
    
    private $parts = array();
    
    public function __construct($url)
    {
        $this->url = $url;
        $this->parts = parse_url($this->url);
    }
    
    protected function checkHost()
    {
        if (in_array($this->getHost(), $this->domains) === false) {
            return false;
        }
        return true;
    }
    
    abstract public function getVideoId();
    
    public function getHost()
    {
        return $this->get('host');
    }
    
    public function getPath()
    {
        return $this->get('path');
    }
    
    public function get($part)
    {
        return $this->parts[$part];
    }
}

YouTubeVideoUrl.php

<?php

class YouTubeVideoUrl extends AbstractVideoUrl
{
    protected $domains = array(
        'www.youtube.com',
        'youtube.com',
        'youtu.be',
        'www.youtu.be'
    );
    
    public function getVideoId()
    {
        if (!$this->checkHost()) {
            throw new InvalidArgumentException('URL inválida!... etc...');
        }
        
        if (strpos($this->getHost(), 'youtu.be') !== false) {
            return ltrim($this->getPath(), '/');
        }
        
        if (preg_match('</(v|vi|embed)/>i', $this->getPath())) {
            $split = explode('/', $this->getPath());
            return end($split);
        }
        
        parse_str($this->get('query'), $result);
        
        foreach($result as $key => $value) {
            if (in_array($key, array('v', 'vi')) !== false) {
                return $value;
            }
        }
        
        return '';
    }
}
<?php

$YouTubeVideoUrl = new YouTubeVideoUrl('//www.youtube.com/watch?v=IFkBudUijgo');

/*
* $YouTubeVideoUrl = new YouTubeVideoUrl('//youtu.be/IFkBudUijgo');
* $YouTubeVideoUrl = new YouTubeVideoUrl('//www.youtube.com/watch?v=IFkBudUijgo');
* $YouTubeVideoUrl = new YouTubeVideoUrl('//www.youtube.com/watch?v=IFkBudUijgo');
* $YouTubeVideoUrl = new YouTubeVideoUrl('//www.youtube.com/vi/IFkBudUijgo');
* $YouTubeVideoUrl = new YouTubeVideoUrl('//www.youtube.com/embed/IFkBudUijgo');
*/

try {
    echo $YouTubeVideoUrl->getVideoId();
}
catch (InvalidArgumentException $InvalidArgumentException) {
    echo $InvalidArgumentException->getMessage();
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa Diogo... uma classe inteira cheia de functions para algo simples? No meu caso, analisando parece muito bom, mas o parse_url ou usando o explode tbm já foram bem úteis.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa Diogo... uma classe inteira cheia de functions para algo simples?

 

Olá Cazzeri, não se trata de uma classe inteira, se trata de solução, veja algo sobre DRY

Não se pode falar de classe como se isso fosse como "carregar uma cruz", as linguagens mais poderosas do mundo são completamente orientadas a objetos.

 

Toda vez que você precisar pegar uma ID em um site diferente, vai ter que reescrever tudo ou copiar e colar o mesmo código.

Esse exemplo que dei resolve isso, veja.

 

DailyMotionVideoUrl.php

class DailyMotionVideoUrl extends AbstractVideoUrl
{
    protected $domains = array(
        'www.dailymotion.com',
        'dailymotion.com',
        'dai.ly'
    );

    public function getVideoId()
    {
        /*
        * [...]
        */
    }
    
/*
* [...]
*/

Outro detalhe no caso do YouTube, se você usar apenas o exemplo simples com parse_url, não vai conseguir obter a ID do vídeo quando a URL for diferente de .../watch?v=

 

A classe YouTubeVideoUrl nunca irá falhar em qualquer URL de vídeo do YouTube.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diogo, KISS!

 

Olá Valéria,

é interessante notar e entender muito bem, acredito que uma opinião deve ser fundada em pesquisa e vivencia, bem, digo isso por que vejo que o uso desses princípios virou um tipo de moda aqui no Brasil.

 

Colocar KISS aqui é como usar algo que não possui ligação para justificar outro. Quero dizer, usar KISS para justificar a preguiça e código ruim.

 

O que é simples: Escrever tudo toda vez, ou apenas uma vez?

 

Ver como é simples abrirmos um cadeado ou ainda acender uma lâmpada? Mas não é fácil fazer um cadeado ou lâmpada. KISS parte deste principio.

 

Existem duas coisas a serem observadas:

 

1 - Será que esse código é complicado ou eu não tenho conhecimento suficiente?

 

2 - Estou usando KISS apenas para mim, ou é uma opinião de todos?

 

Existem diferenças entre coisas complicadas e coisas que apenas alguns ainda não conseguiram entender.

 

Tenho visto uma grande rejeição dos membros do fórum quando o assunto é orientação a objetos, todos vêem como uma coisa complicada, isso não é bom, acaba por afastar programadores experiêntes do site.

 

Eu programo orientado a objetos, algo que acontece desde que somos bebê em Java.

 

Um grande abraço pra você.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro Diogo,

 

Desenvolvo usando orientação a objetos desde sempre. Não se preocupe, entendi perfeitamente o que quis dizer.

 

Minha rejeição ao seu código não é pelo uso de OO, mas sim por apresentar uma solução mais complexa que o necessário, visto que a necessidade do colega é simples, e facilmente implementável em duas linhas de código, como citado acima.

 

Acredito muito na iniciativa KISS, não por preguiça, mas por experiência com desenvolvimento ágil.

Compartilhar este post


Link para o post
Compartilhar em outros sites

por apresentar uma solução mais complexa que o necessário, visto que a necessidade do colega é simples, e facilmente implementável em duas linhas de código, como citado acima.

 

Já que você fez uma réplica, deixe-me da uma tréplica :P rss.

 

É assim, um fórum não é composto apenas pela pessoa que perguntou, por isso, quando respondemos, estamos falando para muitos, mesmo que o colega quer algo simples, vi aqui a oportunidade de um dia daqui a 30 anos alguém entrar no fórum e ver um exemplo bacana e profissional. :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

vi aqui a oportunidade de um dia daqui a 30 anos alguém entrar no fórum e ver um exemplo bacana e profissional. :thumbsup:

 

Bacana pensar isso.

 

Bom, daqui a 30 anos alguém irá ler isso e concordar comigo =p

Hahahha.

 

(E hey, KISS também pode ser bacana e profissional. Nem tudo precisa ser engessado =D )

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites
<?php

$file = file_get_contents ('http://www.youtube.com/watch?v=2ninzFW4MIo');

preg_match('/(?<=url_encoded_fmt_stream_map"\: ")(.*?)(?=")/',$file,$result);

preg_match('/(?<=(<title>))(.*?)(?=(<\/title>))/',$file,$title);


$data = explode(',',$result[0]);

$i = 1;


echo urldecode($data[0]);


foreach ($data as $d){


$t = str_replace("&","&",urldecode($d));

parse_str($t,$b);

$a = parse_url($b['url']);

parse_str($a['query'],$z);

$b = array_merge($b,$z);

$url[$i]['type']=$b['type']." = ".$b['quality'];


$i++;

}

foreach ($url as $v)

{



echo "<p>{$v['type']} ---- <a href='{$v['url']}' target='_blank'>Click Here To Download</a></p>";

}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

BoinaVerde bem nessas rsrsrs... estava pronto para responder a valeriabarros "kiss pra ti tbm" :coolio:

 

Diogo Camargo, vou começar a levar essa frase comigo nos projetos: "O que é simples: Escrever tudo toda vez, ou apenas uma vez?"... E outra, sempre quando peço ajuda, sempre utilizo aquela ideia de código onde deu certo e eu entendi o que estava acontecendo naquele código.

 

Até a próxima pessoal pesquisar o que é kiss

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.