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

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

Marsh Posté le 13-02-2020 à 14:54:48    

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.

Reply

Marsh Posté le 13-02-2020 à 14:54:48   

Reply

Marsh Posté le 13-02-2020 à 15:33:09    

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 Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 13-02-2020 à 16:32:29    

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.

Reply

Marsh Posté le 13-02-2020 à 16:57:45    

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
Reply

Marsh Posté le 13-02-2020 à 17:49:20    

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 Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 14-02-2020 à 08:50:01    

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
Reply

Marsh Posté le 14-02-2020 à 09:37:54    

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 Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 14-02-2020 à 09:44:28    

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
Reply

Marsh Posté le 14-02-2020 à 10:11:21    

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 Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 14-02-2020 à 10:14:45    

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
Reply

Marsh Posté le 14-02-2020 à 10:14:45   

Reply

Marsh Posté le 14-02-2020 à 14:03:31    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed