Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1163 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] - Extraire chemins des fichiers mp3 dans balise audio

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP] - Extraire chemins des fichiers mp3 dans balise audio

n°2346104
Furaxx
Posté le 13-02-2020 à 14:54:48  profilanswer
 

Bonjour,
 
Il s'agit ici de le faire sur PHP mais il s'agit plutôt d'expressions régulières avec lesquelles j'ai toujours eu du mal...
 
Bref, je recherche comment extraire le chemin complet d'un fichier mp3 se trouvant dans une balise audio HTML5.
 
Exemple:
<audio src="../tests/mon_fichier.mp3" controls="controls"></audio>
 
Je souhaiterais récupérer "../tests/mon_fichier.mp3" (sans les guillemets), mon idée étant de le remplacer par autre chose.
 
Par avance, merci pour votre aide.

mood
Publicité
Posté le 13-02-2020 à 14:54:48  profilanswer
 

n°2346109
rufo
Pas me confondre avec Lycos!
Posté le 13-02-2020 à 15:33:09  profilanswer
 

Ben, tu l'as dit, une regexp en PHP (ou javascript en fonction de ce que tu veux faire).
Un site pour aider à construire les regexp : https://regex101.com/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2346116
Furaxx
Posté le 13-02-2020 à 16:32:29  profilanswer
 

J'utilise déjà ce site là pour tenter de m'aider, mais le porblème vient de moi. ;)
 
J'ai cette regexp pour le moment:

Code :
  1. /^.*<audio src="(.*)" controls.*$/mi


 
Avec un preg_match_all ça fonctionne si j'ai une balise audio. Si j'en ai 2 sans retour à la ligne entre les 2, alors seulement la seconde est récupérée.
Si par contre je vais à la ligne entre les 2, alors mon tableau de résultats m'affiche bien ce qu'il faut.

n°2346117
pluj
Posté le 13-02-2020 à 16:57:45  profilanswer
 

Supprimes tes ^.* et .*$ et modificateur m
 
Ce serait éventuellement mieux de la parser avec DOM (une regexp ne gérera pas tous les cas - ordre des attributs HTML, délimiteur utilisé - ou non d'ailleurs - pour la valeur de l'attribut HTML)
 
Il te faudrait une regexp comme celles-ci :

Code :
  1. /<audio\s+src="([^"]*)" controls="controls">/i
  2. /<audio\s+src="([^"]*)" controls="[^"]*">/i
  3. /<audio\s+src="([^"]*)"[^>]*>/i


 
Il faut se méfier quand on écrit quelque chose comme .* : par défaut (en l'absence du modificateur U), le motif est gourmand, c'est-à-dire que la chaîne la plus longue possible va être cherchée à être matchée et dans ton cas, ça va peut être inclure d'autres balises audio justement (si elles sont sur la même ligne vu que . n'inclut pas \n sans le modificateur s). Pour le rendre non gourmand il faut écrire .*? (pour ne rendre que cette partie du motif non gourmande) ou utiliser le modificateur U (sauf que ça sera appliqué à tout le motif et .*? va alors devenir gourmand étant inversé).
 
Donc quand tu peux restreindre le . comme je l'ai fait dans mes propositions, ça permet d'éviter ce problème.
 

Code :
  1. $doc = new DomDocument;
  2. $doc->loadHTMLFile('/chemin/ou/URL/vers/le/fichier.html');
  3. foreach ($doc->getElementsByTagName('audio') as $audio) {
  4.    // faire quelque chose avec $audio->getAttribute('src')
  5. }


?


Message édité par pluj le 13-02-2020 à 18:49:30
n°2346124
rufo
Pas me confondre avec Lycos!
Posté le 13-02-2020 à 17:49:20  profilanswer
 

Oui, effectivement, j'étais parti du principe que t'avais déjà un tableau contenant les balises audio grâce au DOM. :o


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2346150
Furaxx
Posté le 14-02-2020 à 08:50:01  profilanswer
 

Merci beaucoup à vous deux, je vais tester tout ça.
 
Et au passage, avez-vous des références de bouquins ou de bons tutos pour que j'arrive ENFIN à me sortir plus facilement des problèmes que me posent régulièrement les regexp?
Merci! :)
 
EDIT: Après quelques tests, je ne ressors que le premier résultat de ma chaîne de caractères analysée...
 
Voici ma chaine de caractères:

Code :
  1. <p><audio src="test.mp3" controls="controls"></audio></p><p><audio src="test2.mp3" controls="controls"></audio></p>


 
Et mon PHP:

Code :
  1. $reg_exUrl = '/<audio\s+src="([^"]*)"[^>]*>/i';
  2.     if(preg_match_all($reg_exUrl, $post['description'], $output)) {
  3.         var_dump('Ca marche !!');
  4.         var_dump($output);
  5.     } else {
  6.         var_dump('Ca marche pas');
  7.     }


 
Le tableau $output ne me sort que le premier élément "mp3" trouvé, alors que sur Regex Tester il y a bien les 2: https://regex101.com/r/aqrIKL/3
Je dois encore passer à côté de quelque chose...


Message édité par Furaxx le 14-02-2020 à 09:35:16
n°2346155
rufo
Pas me confondre avec Lycos!
Posté le 14-02-2020 à 09:37:54  profilanswer
 

Mais pourquoi tu ne passes pas par le DOM pour avoir déjà un tableau de balises <audio> :??:
 
https://www.php.net/manual/en/domdo [...] sbytagname


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2346156
Furaxx
Posté le 14-02-2020 à 09:44:28  profilanswer
 

Code :
  1. $dom = new DOMDocument;
  2.     $dom->loadHTML($post['description']);
  3.     $audios = $dom->getElementsByTagName('audio');
  4.     foreach ($audios as $audio) {
  5.         echo $audio->nodeValue, PHP_EOL;
  6.     }


 
Il me sors une erreur:

Code :
  1. Warning: DOMDocument::loadHTML(): Tag audio invalid in Entity, on line 79


 
La ligne 79 étant "$dom->loadHTML($post['description']);"
Je vais voir en virant les balises audio voir ce que ça donne, même si ça ne m'intéresse plus des masses mais faut tester. :)
 
EDIT> Pas d'erreur si je retire les balises "audio".
J'ai trouvé des messages sur stackoverflow qui parlent d'une mauvaise gestion des balises HTML5, mais ces messages sont assez vieux, je ne sais pas si c'est toujours le cas du coup mais ça correspondrait.


Message édité par Furaxx le 14-02-2020 à 09:56:24
n°2346159
rufo
Pas me confondre avec Lycos!
Posté le 14-02-2020 à 10:11:21  profilanswer
 

On peut voir le contenu html qui pose pb, svp ?
Sinon, essaye avec cette lib PHP : https://www.php.net/manual/en/funct [...] oad-string
 
Au passage, charger direct le contenu d'un formulaire, ça me paraît un peu dangereux...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2346160
Furaxx
Posté le 14-02-2020 à 10:14:45  profilanswer
 

Le contenu HTML qui pose problème est celui-ci:

Code :
  1. <p><audio src="test.mp3" controls="controls"></audio></p><p><audio src="test2.mp3" controls="controls"></audio></p>


Il y a 2 balises "audio", j'ai donc 2 warnings.
J'ai essayé en insérant une image et là pas de problème je n'ai pas d'erreur, j'ai accès aux attributs, etc...
 
Pour charger directement le contenu du formulaire je sais oui, c'est juste pour mes tests actuellement. :)
 
EDIT> Je viens d'essayer avec simplexml_load_string.
Avec le code ci-dessus ça pose problème car il y a quelque chose après ce qu'il considère être une balise de fin.
Il faut donc pour que ça fonctionne que je rajoute une balise au début et à la fin de mon HTML (ça ça va, c'est pas trop compliqué... ;)).
Bref, je pense qu'il va falloir que je le fasse de cette façon, j'ai bien peur que loadHTML ne gère pas les balises HTML5...
 
EDIT2> Je viens de tomber là dessus: https://packagist.org/packages/masterminds/html5, je vais tester ça voir ce que ça donne.
 
EDIT3> Je continue avec mes tests et masterminds/html5 n'était pas intéressant, j'ai par contre trouvé https://packagist.org/packages/ivop [...] cument-php qui m'a l'air de très bien fonctionner.

Code :
  1. $dom = new IvoPetkov\HTML5DOMDocument();
  2.     $dom->loadHTML($post['description']);
  3.     $audios = $dom->getElementsByTagName('audio');
  4.     foreach ($audios as $audio) {
  5.         var_dump($audio->getAttribute('src'));
  6.     }


En gros la même chose qu'avant, sauf que je n'ai pas d'erreur au niveau des balises "audio" et qu'il me ressort bien les "src". :)


Message édité par Furaxx le 14-02-2020 à 10:50:53
mood
Publicité
Posté le 14-02-2020 à 10:14:45  profilanswer
 

n°2346172
B4X
kebab-case
Posté le 14-02-2020 à 12:54:49  profilanswer
 

https://bit.do/b4xfur4xx


---------------
In vanitas veritas.
n°2346181
Furaxx
Posté le 14-02-2020 à 14:03:31  profilanswer
 

B4X> Merci beaucoup, il ne manquait donc pas grand chose sur un des essais que j'avais fait sur la fin. :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] - Extraire chemins des fichiers mp3 dans balise audio

 

Sujets relatifs
Redirection pour aller chercher certains fichiers sur un autre siteSite one page, bootstrap 4 et validation PHP
[PHP] - nesbot/Carbon: diffForHumans() amène une erreur 500Fonction mail() de PHP avec plusieurs serveurs SMTP
RechercheV en PHP ?[PHP] Remplacer des mots dans une string par des valeurs d'un tableau
[PHP] Obtenir l'URL précédente[PHP] Systme d'alerte
Action batch sur fichiers sélectionnésProblème d'alloc mémoire avec PHP et lib GD pour générer des images
Plus de sujets relatifs à : [PHP] - Extraire chemins des fichiers mp3 dans balise audio


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR