Précédent   Forum du club des développeurs et IT Pro > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/11/2012, 09h50   #1
Elwyn
Membre chevronné
 
Avatar de Elwyn
 
Homme
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 856
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux

Informations forums :
Inscription : juillet 2006
Messages : 856
Points : 745
Points : 745
Par défaut Youtube, Deezer and Soundcloud

Bonjour,

j'aimerais créer trois Regex pour capturer l'ID d'une URL Youtube, Deezer et Soundcloud.

J'ai déjà celle de Youtube :
'%^# Match any youtube URL
      (?:https?://)?  # Optional scheme. Either http or https
      (?:www\.)?      # Optional www subdomain
      (?:             # Group host alternatives
        youtu\.be/    # Either youtu.be,
      | youtube\.com  # or youtube.com
        (?:           # Group path alternatives
          /embed/     # Either /embed/
        | /v/         # or /v/
        | /watch\?v=  # or /watch\?v=
        )             # End path alternatives.
      )               # End host alternatives.
      ([\w-]{10,12})  # Allow 10-12 for 11 char youtube id.
      $%x';
Pourriez-vous svp m'aider pour les deux autres ?

Un lien Deezer : http://www.deezer.com/track/1167893
/^http\:\/\/www\.deezer\.com\/track\/\d{6,7}/
Un lien Soundcloud : http://soundcloud.com/[a-z]artist/[a-z]title

PS : Concernant ma Regex Youtube, je crois qu'elle ne fonctionne pas si le v= est situé derrière un feature= par exemple.
__________________
Dire Straits, Bob Dylan, Led Zeppelin, the Who, Pink Floyd, AC/DC, Guns & Roses, the Doors, ...
Nicolas Jaar, Paul Kalkbrenner, Marek Hermann
Elwyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2012, 15h53   #2
grunk
Modérateur
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 2 520
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 28
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 2 520
Points : 5 262
Points : 5 262
Pas besoin de regex pour faire ça

Par exemple pour youtube et deezer :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
function getYoutubeID($url)
{
  $urlParam = parse_url($url, PHP_URL_QUERY);
  parse_str($urlParam , $params);
  return isset($params['v']) ? $params['v'] : false;
}
 
function getDeezerID($url)
{
    $urlParam = parse_url($url, PHP_URL_PATH);
    return substr($urlParam ,strrpos($urlParam ,'/') +1);
}
Pour soundcloud il faut récupérer auteur + piste ? Si c'est le cas c'est le même principe que deezer , sauf que tu fais un explode au lieu de substr
__________________
Pry Framework php5 | Recherche CDI dev. Web sur Dijon et alentours.
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2012, 10h47   #3
Elwyn
Membre chevronné
 
Avatar de Elwyn
 
Homme
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 856
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux

Informations forums :
Inscription : juillet 2006
Messages : 856
Points : 745
Points : 745
Bonjour et merci pour ta réponse.

Concernant Youtube, je suis tout à fait d'accord avec ta méthode. Je vais tester et te faire un retour.

Concernant Deezer, pourrais-tu m'expliquer la logique stp ?

Pour Soundcloud non, je souhaite récupérer le titre seulement.
__________________
Dire Straits, Bob Dylan, Led Zeppelin, the Who, Pink Floyd, AC/DC, Guns & Roses, the Doors, ...
Nicolas Jaar, Paul Kalkbrenner, Marek Hermann
Elwyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2012, 11h04   #4
grunk
Modérateur
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 2 520
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 28
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 2 520
Points : 5 262
Points : 5 262
Pour deezer :

Code :
$urlParam = parse_url($url, PHP_URL_PATH);
on récupère ici tous les paramètres après l'url , donc par exemple "/track/1167893"

Code :
substr($urlParam ,strrpos($urlParam ,'/') +1)
Je cherche avec strrposla position du dernier / de la liste des paramètres. Je ne garde ensuite avec substr que la partie de la chaine qui se trouve à position du dernier / + 1. le +1 permettant simplement de ne pas avoir le / dans la chaine retourné.

Du coup pour soundclound ,la fonction deezer doit marcher.
__________________
Pry Framework php5 | Recherche CDI dev. Web sur Dijon et alentours.
grunk est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/11/2012, 11h11   #5
Elwyn
Membre chevronné
 
Avatar de Elwyn
 
Homme
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 856
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux

Informations forums :
Inscription : juillet 2006
Messages : 856
Points : 745
Points : 745
Merci,

pour récapituler :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function getYoutubeID($url)
{
  $urlParam = parse_url($url, PHP_URL_QUERY);
  parse_str($urlParam , $params);
  return isset($params['v']) ? $params['v'] : false;
}
 
function getDeezerID($url)
{
    $urlParam = parse_url($url, PHP_URL_PATH);
    return substr($urlParam ,strrpos($urlParam ,'/') +1);
}
 
function getSoundcloudID($url)
{
    $urlParam = parse_url($url, PHP_URL_PATH);
    return substr($urlParam ,strrpos($urlParam ,'/') +1);
}
Tout est ok ?
__________________
Dire Straits, Bob Dylan, Led Zeppelin, the Who, Pink Floyd, AC/DC, Guns & Roses, the Doors, ...
Nicolas Jaar, Paul Kalkbrenner, Marek Hermann
Elwyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2012, 11h16   #6
grunk
Modérateur
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 2 520
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 28
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 2 520
Points : 5 262
Points : 5 262
A priori oui , il faut tester.

Si tu as vraiment besoin de la fonction pour soundcloud , fait juste un alias , recopie pas le code :

Code :
1
2
3
4
function getSoundcloudID($url)
{
    return getDeezerID($url);
}
Après tu peux améliorer un peu la fonction deezer , pour être sur qu'elle te renvoi bien une suite de chiffre par exemple (renvoyer false sinon) et tout ce genre de petites vérification
__________________
Pry Framework php5 | Recherche CDI dev. Web sur Dijon et alentours.
grunk est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/11/2012, 19h25   #7
Elwyn
Membre chevronné
 
Avatar de Elwyn
 
Homme
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 856
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux

Informations forums :
Inscription : juillet 2006
Messages : 856
Points : 745
Points : 745
Finalement, serait-il possible de passer tout ça en Regex svp ?
Mon code est fait de telle manière que les Regex m’arrangerait.

Merci d'avance
__________________
Dire Straits, Bob Dylan, Led Zeppelin, the Who, Pink Floyd, AC/DC, Guns & Roses, the Doors, ...
Nicolas Jaar, Paul Kalkbrenner, Marek Hermann
Elwyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2012, 00h37   #8
CosmoKnacki
Membre habitué
 
Avatar de CosmoKnacki
 
Homme
Inscription : mars 2009
Messages : 106
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2009
Messages : 106
Points : 130
Points : 130
Bonjour,

Code :
1
2
3
$patternYoutube = '/(?<=v=)[\w-]+/';
$patternDeezer = '/\d+/';
$patternSoundcloud = '#[\w-]+$#';
pour les 3 à la fois:
Code :
$pattern = '#(?<=v=)[\w-]+|[^/?&]+$#';
CosmoKnacki est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/11/2012, 10h24   #9
Elwyn
Membre chevronné
 
Avatar de Elwyn
 
Homme
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 856
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux

Informations forums :
Inscription : juillet 2006
Messages : 856
Points : 745
Points : 745
Bonjour, et merci beaucoup pour ta réponse.
Je ne comprend pas la Regex de Deezer, es-tu sûr ?
__________________
Dire Straits, Bob Dylan, Led Zeppelin, the Who, Pink Floyd, AC/DC, Guns & Roses, the Doors, ...
Nicolas Jaar, Paul Kalkbrenner, Marek Hermann
Elwyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2012, 19h11   #10
CosmoKnacki
Membre habitué
 
Avatar de CosmoKnacki
 
Homme
Inscription : mars 2009
Messages : 106
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2009
Messages : 106
Points : 130
Points : 130
Pour Deezer il n'y a qu'une série de chiffres à récupérer et les seuls chiffres présents dans l'url sont justement ceux que l'on souhaite.
J' utilise donc la classe prédéfinie \d (qui équivaut à [0-9]) pour les récupérer sans avoir à me soucier de leur position d'où l'absence de l'ancre de fin $.

Maintenant dans la réponse que je t'ai donnée, je présume que la recherche porte sur une chaîne contenant uniquement l'url à analyser.

Code :
1
2
preg_match('/\d+/', 'http://www.deezer.com/track/1167893', $match);
echo array_pop($match);
CosmoKnacki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2012, 10h31   #11
Elwyn
Membre chevronné
 
Avatar de Elwyn
 
Homme
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 856
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux

Informations forums :
Inscription : juillet 2006
Messages : 856
Points : 745
Points : 745
Bonjour,

D'accord, je comprend mieux.
Et pour Soundcloud tu recherches la dernière chaine de caractères si j'ai bien compris.

EDIT : En fait pour Soundcloud, je dois récupérer l'artiste et le titre.
__________________
Dire Straits, Bob Dylan, Led Zeppelin, the Who, Pink Floyd, AC/DC, Guns & Roses, the Doors, ...
Nicolas Jaar, Paul Kalkbrenner, Marek Hermann
Elwyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2012, 19h14   #12
CosmoKnacki
Membre habitué
 
Avatar de CosmoKnacki
 
Homme
Inscription : mars 2009
Messages : 106
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2009
Messages : 106
Points : 130
Points : 130
Voilà, c'est ça.

Maintenant si les urls sont prises dans un texte quelconque et que tu veux récupérer les informations (avec l'artiste pour soundcloud) de manière exploitable, tu peux faire ceci:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$txt = <<<'LOD'
blah blah blah URL = 'http://www.youtube.com/watch?v=1wc-AQJ2MYo&feature=fvwp' Deezer ->>> http://www.deezer.com/track/7157481 blah http://www.youtube.com/watch?v=Ri0N_ifn2iM&feature=fvwp
urlSoundcloud = 'http://soundcloud.com/villagepeople/ymca' youtube.com/watch?v=Ri0N_ifn2iM&feature=fvwp blah blah blah
http://www.deezer.com/track/7157481
LOD;
$patternTxt = '#(?:/watch\?(?:[^&]*?&)*?v=)([\w-]{11})
               |(?:deezer\.com/[^/]+/)(\d+)
               |(?:soundcloud\.com/)([\w-]+)/([\w-]+)#sx';
 
$result = array('youtube' => array(), 'deezer' => array(), 'soundcloud' => array());
$callback = function ($match) use (&$result) {
    if (!empty($match[1])) array_push($result['youtube'],$match[1]);
    if (!empty($match[2])) array_push($result['deezer'],$match[2]);
    if (!empty($match[3])) array_push($result['soundcloud'],$match[3],$match[4]);
};
preg_replace_callback($patternTxt, $callback, $txt);
foreach($result as &$item) { $item = array_unique($item); } //pour éviter les doublons
echo '<pre>';
print_r($result);
echo '</pre>';
Si tu as juste une url à parser, pour soundcloud, tu peux utiliser ça: #([\w-]+)/([\w-]+)$#
CosmoKnacki est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/11/2012, 15h26   #13
Elwyn
Membre chevronné
 
Avatar de Elwyn
 
Homme
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 856
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux

Informations forums :
Inscription : juillet 2006
Messages : 856
Points : 745
Points : 745
Merci pour toutes ces réponses.
En fait, l'utilisateur copiera directement son lien Youtube, Deezer ou Soundcloud.

Pour Deezer et Soundcloud, j'aimerais rajouter le début de l'URL, on ne sait jamais, je n'ai pas envie qu'il copie directement l'ID de la vidéo.

Quelque chose du style : http://soundcloud.com/([\w-]+)/([\w-]+)$
Comment le traiter dans un preg_match() ensuite ?

Idem pour Deezer, merci d'avance !
__________________
Dire Straits, Bob Dylan, Led Zeppelin, the Who, Pink Floyd, AC/DC, Guns & Roses, the Doors, ...
Nicolas Jaar, Paul Kalkbrenner, Marek Hermann
Elwyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2012, 19h58   #14
Elwyn
Membre chevronné
 
Avatar de Elwyn
 
Homme
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 856
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux

Informations forums :
Inscription : juillet 2006
Messages : 856
Points : 745
Points : 745
@CosmoKnacki : As-tu essayé de répondre ?
__________________
Dire Straits, Bob Dylan, Led Zeppelin, the Who, Pink Floyd, AC/DC, Guns & Roses, the Doors, ...
Nicolas Jaar, Paul Kalkbrenner, Marek Hermann
Elwyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h26.


 
 
 
 
Partenaires

Hébergement Web