Bonjour à tous.
Il y a belle lurette que je n'ai plus écrit une ligne de code PHP (ou autre d'ailleurs) aussi vais-je essayer de me montrer le plus clair possible.
J'avais d'abord posté, par un vieux réflexe, sur le forum PHP dédié aux regexp mais je ne suis pas sûr que le fonctionnement des fonctions preg_replace et preg_match soient assimilables à ceux de sed et grep.
Pour les besoins de la construction d'un moteur de recherche sur mon site de chansons je voudrais trouver un motif de regexp qui excluerait tout ce qui est entre crochets, crochets compris.
Un exemple valant souvent mieux qu'un long discours, disons que j'ai des choses comme cela (dans plus de 750 fichiers différents):
et que je souhaiterais obtenir ceciCitation:
"[Bm]Elle est vapeur dans le nu[A]age,\n",
"dans le ruisseau ce babi[G]llage.\n",
"Elle est la pluie sur ma [F#]peau.\n\n",
"[Bm]Elle est la vague sur la [A]plage,\n",
"la cascade dans les al[G]pages.\n",
"Elle est embruns sur mon ba[F#]teau.\n\n",
"[D]Elle est source de toute [Em]chose.\n",
"C‘est sur elle que la vie re[D]pose\n",
"qu‘elle soit glace dans les né[Em]vés\n",
"ou grêlons dans les gibou[F#]lées.\n\n",
"[D]Quand elle irrigue les plants de [Em]riz\n",
"ou bien qu‘elle éteint l‘incen[D]die,\n",
"elle accomplit tant de prou[Em]esses\n",
"qu‘on d‘vrait bien en faire notre dé[F#]esse.\n\n",
"[Bm]Elle est neige dans le bli[A]zzard,\n",
"voile cotonneux dans le broui[G]llard\n",
"et même la sueur sur ma [F#]peau.\n\n",
"[Bm]Elle sait se glisser n‘importe [A]où,\n",
"en filet ou en gros re[G]mous,\n",
"rien ne résiste à ses a[F#]ssauts.\n\n",
"[D]Elle a englouti la ville [Em]d‘Ys"
À cette fin j'ai écrit une commande que j'appelle via la fonction PHP shell_execCitation:
"Elle est vapeur dans le nuage,\n",
"dans le ruisseau ce babillage.\n",
"Elle est la pluie sur ma peau.\n\n",
"Elle est la vague sur la plage,\n",
"la cascade dans les alpages.\n",
"Elle est embruns sur mon bateau.\n\n",
"Elle est source de toute chose.\n",
"C‘est sur elle que la vie repose\n",
"qu‘elle soit glace dans les névés\n",
"ou grêlons dans les giboulées.\n\n",
"Quand elle irrigue les plants de riz\n",
"ou bien qu‘elle éteint l‘incendie,\n",
"elle accomplit tant de prouesses\n",
"qu‘on d‘vrait bien en faire notre déesse.\n\n",
"Elle est neige dans le blizzard,\n",
"voile cotonneux dans le brouillard\n",
"et même la sueur sur ma peau.\n\n",
"Elle sait se glisser n‘importe où,\n",
"en filet ou en gros remous,\n",
"rien ne résiste à ses assauts.\n\n",
"Elle a englouti la ville d‘Ys"
Le grep fonctionne correctement sur le résultat que lui fournit le sed (j'ai testé la commande en console), mais, le sed ne fournissant pas le résultat escompté le grep ne trouve pas certaines occurences au sein desquelles sont incrustés des accords.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 /*supprimer les accords avec une commande (sed) et filtrer le résultat du (sed) en le redirigeant (| pipe) vers une commande(grep($motif)) explicitation de la regexp : "s/\[[^\]]*\]//g"/ représente, potentiellement, tous les accords incrustés dans le texte entre [ et ] s pour subsitute / délimiteur, début de regexp \[ doit commencer par un crochet ouvrant, [^\]]* 0 à n caractères autres que crochet fermant \] crochet fermant / délimiteur fin de regexp substituer rien aux couples [ ] et son contenu ([^\]]*) / délimiteur fin de substitution g pour global, c.a.d. appliquer sur l'ensemble de la ligne */ $fouille=shell_exec('sed "s/\[^\]*]\]//g" '.$chant.' | grep -i "'.$motif.'"');// avec -i de grep on est case non-sensitive
Il doit donc y avoir un truc qui n'est pas bon dans la regexp du sed.
Je l'ai testé en console avec des résultats incohérents, ça fonctionne sur quelques rares fichiers et pas sur les autres sans que j'arrive à déterminer pourquoi.
Dans l'idéal, j'aurais voulu, pour des raisons de performances, que le shell s'appliquât à l'intégralié de arrays/*.php, mais, avec le pipe (|) vers grep, on perd la référence au fichier puisqu'il ne connait plus que la stdin, or cette référence m'est indispensable ensuite pour proposer des liens vers les chansons qui matchent avec la recherche, donc je suis obligé de lancer la commande shell_exec dans une boucle sur chaque fichier du dossier arrays.
Mais, essayons déjà de résoudre le problème de la regexp du sed.
Merci d'avance à quiconque prendra le temps de me lire et de me répondre.