Bonjour,
J'essaie de mettre au point une fonction me permettant de remplacer certain "mot" pour y insérer une infobulle quand on survole le "mot"
Tout cela n'est pas très clair... alors voici un exemple:
Mon texte est du type:
Je veux donc remplacer tous les accords (dans l'ordre E7,E7,D,Bsus,E7,A...) par une infobulle, bref pour cela pas de problème.E7 E7/D Bsus
E7 A D Dmaj7 Bsus b(no 3rd)
Boy Mercury shootin' through ev'ry degree
E7 A D Dmaj7 Bsus b(no 3rd)
Oh-ho girl dancin' down those dirty and dusty trail-ai-ails
Voici un bout de ma fonction qui fait cela:
Ceci marche ... mais ma regex rencontre quelques soucis parfois car il y a beaucoup d'exception.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 // Je récupère tous les accords correspondant $req = mysql_query("SELECT * FROM `accords` INNER JOIN `tab-accord` ON `accords`.id=`tab-accord`.`accord-id` WHERE `tab-accord`.`tab-id` = '$tab_id'"); // Boucle qui va faire les changements pour chaques accords while($accord = mysql_fetch_assoc($req)) { $tabla = make_tabla($accord[doigt],$accord[accord],$accord[fret]); // Genère le diagramme #$pattern = ";([^aA-zZ1-9<()] *)$accord[accord]( */?,?[^\\-|aA-zZ0-9<>#]);"; $pattern = ";( +|[^aA-zZ1-9<>] {0}| ?/ ?|[^aA-zZ1-9()] {1})$accord[accord]($| ?/| ?,|[^aA-zZ1-9()#<>|]| +|\([mM]\))([^\w]);s"; $textTab = preg_replace("$pattern", "$1<a class=infob href=\"#\"><span><pre>$tabla</pre></span>$accord[accord]</a>$2$3", $textTab); }
En effet l'accord à remplacer peut ce trouver:
- avec 0 caractère devant
- avec plusieurs espace devant
- avec un '/' devant
- avec 0 ou plusieurs espace après
- sans texte avant ou apres (pour ne pas remplacer les paroles)
- ...
Bref je suis un peu perdu... voyez vous un moyen de faire un preg_replace plus propre ? Ou une meilleur solution ?
Merci d'avance pour votre aide.
Partager