REGEX

Messages postés
233
Date d'inscription
vendredi 2 juillet 2004
Statut
Membre
Dernière intervention
4 janvier 2007
- - Dernière réponse : J_G
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
- 24 nov. 2005 à 10:46
Bonjour


Je débute en expressions régulières, et je suis confronté à un problème.



Je dispose de ceci dans une variable :



Récit expressif,

Positif expressif,

Grand orgue,

Pédalier,

----

Bourdon 16

cor de nuit 8

flûte traversière 8

gambe 8

voix celeste 8

flûte 4

octavin 2

cornet 5 rangs

cor anglais 16

hautbois 8

trompette harmonique 8

clairon 4, voix humaine 8

tremblant

,

quintaton 16

cor de nuit 8

flutes 8 et 4

salicional 8

prestant 4

quartede nasard 2

nasard

tierce

plein jeu 3 rangs

clarinette 8

trompette 8

,

Montres 16 et 8

bourdon 8

flute harmonique 8

violon 8

prestant 4

doublette 2

cymbale 4 rangs

fourniture 5 rangs

basson 16

trompette 8

clairon 4

,

contrebasse 16

soubasse 16

flute 8

flute 4 bombarde 16

trompette 8




Et je voudrais arriver à ceci :



Récit expressif,

Positif expressif,

Grand orgue,

Pédalier,

----

<li>Bourdon 16
</li>

<li>cor de nuit 8</li>

<li>flûte traversière 8</li>

<li>gambe 8</li>

<li>voix celeste 8v

<li>flûte 4</li>

<li>octavin 2</li>

<li>cornet 5 rangs</li>

<li>cor anglais 16</li>

<li>hautbois 8</li>

<li>trompette harmonique 8</li>

<li>clairon 4, voix humaine 8</li>

<li>tremblant</li>

,

<li>quintaton 16</li>

<li>cor de nuit 8</li>

<li>flutes 8 et 4</li>

<li>salicional 8</li>

<li>prestant 4</li>

<li>quartede nasard 2</li>

<li>nasard</li>

<li>tierce</li>

<li>plein jeu 3 rangs</li>

<li>clarinette 8</li>

<li>trompette 8</li>

,

<li>Montres 16 et 8</li>

<li>bourdon 8</li>

<li>flute harmonique 8</li>

<li>violon 8</li>

<li>prestant 4</li>

<li>doublette 2</li>

<li>cymbale 4 rangs</li>

<li>fourniture 5 rangs</li>

<li>basson 16</li>

<li>
trompette 8</li>

<li>
clairon 4</li>

,

<li>
contrebasse 16</li>

<li>
soubasse 16</li>

<li>
flute 8</li>

<li>
flute 4 bombarde 16</li>

<li>
trompette 8</li>




Que dois-je utiliser ???

Merci de m'aider.

A bientôt
Afficher la suite 

13 réponses

Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
6
0
Merci
Salut...



J'aime bien ce genre de petit problème, car il y'a souvent une solution simple est efficace...



Si ton but est de juste transformer ce texte :



$texte = /* tout ton texte */;



// on sépare les lignes

$ligne = explode("\n", $texte);



// on parcours chaque ligne

foreach($ligne as $k=>$v) {

// si c'est un tag HTML, passe !

$t = trim($v);

if( $t{0}=='<' or $t{strlen($t)-1}=='>' ) continue;



// sinon on transforme

$ligne[$k] = "<li>$v</li>";

}



// et voilà :)

$texte = implode($ligne);
Commenter la réponse de J_G
Messages postés
233
Date d'inscription
vendredi 2 juillet 2004
Statut
Membre
Dernière intervention
4 janvier 2007
0
Merci
Salut

Merci pour ta réponse rapide.

Mais en fait, je n'ai donné qu'une partie du code (je ne pensais pas qu'il fallait l'autre).

Mon texte à transformé est plutot ca :




blablablablablablablablablablablablablablablablablablablablablablablab

lablablablablablablablablablablablablablabla

blablablablablablablablablablablablablablablablablabla

blablablablablablablablablablablav


LE TABLEAU


blablablablablablablablablablablablablablabla

blablablablablablablablablablablablablablablabla

blablablablablablablablablablablablablablablablablablablablablablablablablablablabla

blablablablablablablablablablabla

blablablablablablabla

blablablablablablablablablablablabla




Et je dois transformer toutes les listes qui sont entre et .

Comment faire pour ne garder qu'elles ?

C'est pour ca que je pensais que j'aurais besoin des regex.

As tu une solution ?
Commenter la réponse de massacr
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
6
0
Merci
Alors là oui, il te faut utiliser les regexp...



dont je suis pas vraiment maitre...





un truc du genre @(.*)@im

Te sortira tout ce qui se trouve entre les balises ul

(im c'est pour "insensible à la casse et multiligne")



au cas où soit spécifiées des attributs dans les ul :

$regle = @(.*)@im



Bon, puis après un

$arr = array();

preg_match_all($texte, $regle, &$arr);



devrait te pondre un tableau tout fou où le résultat attendu est dans :

foreach($arr[1] as $n=>$ul) {

// dans $ul un contenu d'un

}



En gros... ça donne ça ! Mais je ne garanti pas le bon fonctionnement de ma règle.
Commenter la réponse de J_G
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
6
0
Merci
il y'a un espace de trop ici :



$regle = @(.*)@im



Ah sa joue très fin les regexp... !
Commenter la réponse de J_G
Messages postés
233
Date d'inscription
vendredi 2 juillet 2004
Statut
Membre
Dernière intervention
4 janvier 2007
0
Merci
Ca ne marche pas.

Le problème est qu'il recherche nimportequoi au lieu de nimportequoi entouré de .

Connais tu la solution ?
Commenter la réponse de massacr
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
6
0
Merci
fait un coup de





str_replace(' ','&nbsp;&nbsp;',nl2br(var_export($arr, true)));





est regarde la composition du tableau de resultat...

le nimportequoi est le resultat global



Mais sous d'autre indexe de $arr, tu trouvera ce qu'il y'a à l'intérieur des
Commenter la réponse de J_G
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
6
0
Merci
echo str_replace(' ','&nbsp;&nbsp;',nl2br(var_export($arr, true)));
Commenter la réponse de J_G
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
6
0
Merci
$regle = @(.*)@im



ceci devrait suffir...
Commenter la réponse de J_G
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
6
0
Merci
note en passant : connais-tu la balise <th> ?



<tr id="titretableau">
<td>Récit expressif</td>
<td>Positif expressif</td>
<td>Grand orgue</td>
<td>Pédalier</td>
</tr>




C'est justement pour pouvoir donner un style particulier aux entêtes de tableau (th = Table Header).



<tr>
<th>Récit expressif</th>
<th>Positif expressif</th>
<th>Grand orgue</th>
<th>Pédalier</th>
</tr>


puis tu fais un CSS comme ça :



th {

font-weight:bold;

/* ... */

}
Commenter la réponse de J_G
Messages postés
233
Date d'inscription
vendredi 2 juillet 2004
Statut
Membre
Dernière intervention
4 janvier 2007
0
Merci
Bonne idée pour th..



Mais ta méthode ne marche toujours pas. Il n'y a rien dans le tableau $arr.

Je te passe mon script :



$_POST['texte']*****************************

Histoire




Cet instrument, à l'origine, date de 1876, et
fut construit par le grand facteur Merklin. Après bien des vissicitudes
(une restauration extrêment contestable en 1946, puis un
empoussièrement considérable du à l'édification de tribunes latérales),
une restauration complète fut décidée en accord avec les différents
curés de Saint Pothin, Bernard Théveniau, Michel Desvignes et Gilbert
Sanchez. Le tout piloté par l'association des amis de l'orgue, présidée
avec brio et efficacité par Jacques Renault, puis André-Louis Appaix.
Jacques Renault assuma entièrement la responsabilité de la
restauration, tandis que son successeur s'occupe activement de la mise
en valeur(concerts, visites guidées,etc...).

Vous pouvez voir quelques photos de l'orgue ici : [index.php?demande= 4 accéder à la galerie photo]




Composition




Grâce au génie du facteur Daniel Kern, nous
avons à présent retrouvé un magnifique instrument symphonique de 43
jeux (qui deviendront 46 dès que nos finances le permettront):




Récit expressif,

Positif expressif,

Grand orgue,

Pédalier,

----

Bourdon 16

cor de nuit 8

flûte traversière 8

gambe 8

voix celeste 8

flûte 4

octavin 2

cornet 5 rangs

cor anglais 16

hautbois 8

trompette harmonique 8

clairon 4, voix humaine 8

tremblant

,

quintaton 16

cor de nuit 8

flutes 8 et 4

salicional 8

prestant 4

quartede nasard 2

nasard

tierce

plein jeu 3 rangs

clarinette 8

trompette 8

,

Montres 16 et 8

bourdon 8

flute harmonique 8

violon 8

prestant 4

doublette 2

cymbale 4 rangs

fourniture 5 rangs

basson 16

trompette 8

clairon 4

,

contrebasse 16

soubasse 16

flute 8

flute 4 bombarde 16

trompette 8




Tous accouplements et tirasses en 8, + récit sur lui même en 16, et récit sur grand orgue en 16.

On notera la présence d'un combinateur électonique très efficace:
16x16x8=1248 ! avec séquenceurs aller-retour, aux manuels et au
pédalier.




Le titulaire




Titulaire de l'orgue de St Pothin, Loic Maillié, biographie, photo, etc...


***********************************



preg_match_all('!(.*)!im', $_POST['texte'], $arr);

print_r($arr);



Il affiche :


Array
(
[0] => Array
(
)

[1] => Array
(
)

)
Commenter la réponse de massacr
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
6
0
Merci
Tiens, j'ai trouvé ça : @([\w\s]*)@im



les résultats se trouve dans $arr[1];





par aileur, je te donne mon script qui test les regexp, comme ça tu pourras faire ta propre cuisine :

<?php

$regexp = stripslashes(isset($_POST['regexp']) ? $_POST['regexp'] : '');

$texte = stripslashes(isset($_POST['texte']) ? $_POST['texte'] : '');

?>

<hr />

<form method="post">

RegExp = " size="32" />


Texte =


<textarea name="texte" rows="15" cols="48"
/><?=htmlspecialchars($texte);?></textarea>




</form>

<hr />

Resultat


<?php

$res = array();

preg_match_all($regexp,$texte,&$res);

echo str_replace(' ', '&nbsp;&nbsp;',nl2br(htmlspecialchars(stripslashes(var_export($res,true)))));

?>





A+
Commenter la réponse de J_G
Messages postés
233
Date d'inscription
vendredi 2 juillet 2004
Statut
Membre
Dernière intervention
4 janvier 2007
0
Merci
Ok, maintenant ca marche.

Mais j'aimerais rajouter des <li>blabla</li>. La seule
particularité de chaque ligne est qu'elle débute par une majuscule.
Qu'elle manipulation effectuer sur chaque ul ???
Commenter la réponse de massacr
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
6
0
Merci
Si ton but est de juste transformer ce texte :



$texte = /* tout ton texte */;



// on sépare les lignes

$ligne = explode("\n", $texte);



// on parcours chaque ligne

foreach($ligne as $k=>$v) {

// si c'est un tag HTML, passe !

$t = trim($v);

if( $t{0}=='<' or $t{strlen($t)-1}=='>' ) continue;



// sinon on transforme

$ligne[$k] = "<li>$v</li>";

}



// et voilà :)

$texte = implode($ligne);
Commenter la réponse de J_G