OVH Cloud OVH Cloud

RegEx et decoupage de chaine

7 réponses
Avatar
Stephane Santon
Bonjour,

Je voudrais écrire un filtre de mise en forme de listes à puces pour
SPIP, donc faire une cherche d'expressions.
Le but est de découper ma chaine de texte à tous les délimiteurs
<p class="spip"> ou <br />
en sachant quel est le délimiteur présent juste avant chaque chaîne.

J'ai tourné dans tous les sens les fonctions ereg, split, ... sans
succès.
Pour l'instant, j'en arrive à utiliser strpos, mais pour trouver la
première chaine correspondante, il faut que je fasse un strpos pour <p
class="spip">, puis un autre pour <br /> et prendre la valeur mini. Pas
très efficace !

Quelle serait la fonction et la bonne formule qui vont bien ?

--
** Anti-Spam : ajouter [usenet] dans l'objet pour ne pas être rejeté.

Cordialement, Stéphane *** http://www.team-santonum.com
Loisirs, nature, arts, technologie : accueil en Charente-Maritime

7 réponses

Avatar
Christophe PEREZ
Le Sun, 16 Nov 2003 09:49:59 +0000, Stephane Santon a écrit:

Bonjour,

Quelle serait la fonction et la bonne formule qui vont bien ?


Personnellement, il ne me semble pas avoir assez d'éléments sur ce que tu
veux avoir en résultat, et ce dont tu pars (je ne connais pas spip).

Donne un exemple du texte initial, et un exemple de sortie souhaitée, on
pourra voir ce qu'on peut en faire ;-)

--
Christophe PEREZ
Écrivez moi sans _faute !

Avatar
Stephane Santon
Bonjour,

Donne un exemple du texte initial, et un exemple de sortie souhaitée, on
pourra voir ce qu'on peut en faire ;-)


Le texte original est dans une variable chaîne et du genre :

<p class="spip">blabla blabla</p>
<p class="spip">blabla2 blabla2<br />
blabla3 blabla3<br />
blabla4 blabla4</p>
<p class="spip">blabla blabla5</p>

Et je veux découper en un tableau du genre

array(
1 -> <p class="spip">blabla blabla
2 -> </p>
3 -> <p class="spip">blabla2 blabla2
4 -> <br />
blabla3 blabla3
5 -> <br />
blabla4 blabla4
6 -> </p>
7 -> <p class="spip">blabla blabla5
8 -> </p>

ou plus détaillé encore comme :

1 -> <p class="spip">
2 -> blabla blabla
3 -> </p>
4 -> <p class="spip">
5 -> blabla2 blabla2
6 -> <br />
...

Pour la suite du traitement, je chercherai.

--
** Anti-Spam : ajouter [usenet] dans l'objet pour ne pas être rejeté.

Cordialement, Stéphane *** http://www.team-santonum.com
Loisirs, nature, arts, technologie : accueil en Charente-Maritime

Avatar
Christophe PEREZ
Le Sun, 16 Nov 2003 19:11:01 +0000, Stephane Santon a écrit:

Soit :

$chaine = '
<p class="spip">blabla blabla</p>
<p class="spip">blabla2 blabla2<br />
blabla3 blabla3<br />
blabla4 blabla4</p>
<p class="spip">blabla blabla5</p>
';

array(
1 -> <p class="spip">blabla blabla
2 -> </p>
3 -> <p class="spip">blabla2 blabla2
4 -> <br />
blabla3 blabla3
5 -> <br />
blabla4 blabla4
6 -> </p>
7 -> <p class="spip">blabla blabla5
8 -> </p>


peut être donné par :

$tabl = array_splice(explode('<',$chaine),1,-1);
foreach($tabl as $key => $val) {
$tabl[$key] = "<".$val;
}

ou plus détaillé encore comme :

1 -> <p class="spip">
2 -> blabla blabla
3 -> </p>
4 -> <p class="spip">
5 -> blabla2 blabla2
6 -> <br />


$tabl = preg_split("/n/",preg_replace(
array("/^</","/>$/","/>/","/</","/FIN_DE_BALISE$/","/^DEBUT_DE_BALISE/"),
array("DEBUT_DE_BALISE","FIN_DE_BALISE",">n","n<",">","<"),
$chaine),-1,PREG_SPLIT_NO_EMPTY);

En espérant que tu n'aies jamais de chaîne DEBUT_DE_BALISE en début de
ligne et FIN_DE_BALISE en fin de balise :-))

Je ne sais pas si on peut faire plus simple, mais ça, ça semble
fonctionner.

Pour la suite du traitement, je chercherai.



J'espère bien :-)

--
Christophe PEREZ
Écrivez moi sans _faute !

Avatar
Stephane Santon
Bonjour,

Merci beaucoup pour ces indications.

$tabl = array_splice(explode('<',$chaine),1,-1);
foreach($tabl as $key => $val) {
$tabl[$key] = "<".$val;
}


Je vais partir sur cet base.

$tabl = preg_split("/n/",preg_replace(
array("/^</","/>$/","/>/","/</","/FIN_DE_BALISE$/","/^DEBUT_DE_BALISE/"),
array("DEBUT_DE_BALISE","FIN_DE_BALISE",">n","n<",">","<"),
$chaine),-1,PREG_SPLIT_NO_EMPTY);

En espérant que tu n'aies jamais de chaîne DEBUT_DE_BALISE en début de
ligne et FIN_DE_BALISE en fin de balise :-))


J'ai mis un certain temps à comprendre que DEBUT_DE_BALISE étant une
chaine 'bidon' pour faire un marqueur, et NON un texte à remplacer dans
le cas spécifique d'une recherche de chaîne.

Sinon, je n'ai pas trouvé de doc sur la signification des '/' de part et
d'autre de /n dans l'expression rationnelle de preg_split, comme dans
preg_replace. Est-ce pour délimiter un texte de recherche, et ne pas
considérer les caractères comme des caractères spéciaux de filtrage ?

--
** Anti-Spam : ajouter [usenet] dans l'objet pour ne pas être rejeté.

Cordialement, Stéphane *** http://www.team-santonum.com
Loisirs, nature, arts, technologie : accueil en Charente-Maritime

Avatar
Christophe PEREZ
Le Tue, 18 Nov 2003 08:52:20 +0000, Stephane Santon a écrit:

Bonjour,


Yep !

Merci beaucoup pour ces indications.


Je t'en prie.

$tabl = array_splice(explode('<',$chaine),1,-1);
foreach($tabl as $key => $val) {
$tabl[$key] = "<".$val;
}


Je vais partir sur cet base.


Ok.

En espérant que tu n'aies jamais de chaîne DEBUT_DE_BALISE en début de
ligne et FIN_DE_BALISE en fin de balise :-))


J'ai mis un certain temps à comprendre que DEBUT_DE_BALISE étant une
chaine 'bidon' pour faire un marqueur, et NON un texte à remplacer dans
le cas spécifique d'une recherche de chaîne.


Désolé, j'aurais du mieux expliquer.

Sinon, je n'ai pas trouvé de doc sur la signification des '/' de part et
d'autre de /n dans l'expression rationnelle de preg_split, comme dans
preg_replace. Est-ce pour délimiter un texte de recherche, et ne pas
considérer les caractères comme des caractères spéciaux de filtrage ?


C'est la syntaxe des masques. Il faut un délimiteur début et fin de masque
valide, ça peut être "/.../", "{...}", "|...|","(...)","[...]","<...>",
mais aussi "a...a", "A...A" etc... et c'est après le délimiteur de fin
qu'on met les options éventuelles "/.../Us" par exemple.
Voir php-manual/ref.pcre.html : Expressions régulières compatibles Perl

(Désolé pour les puristes pour le "régulières" au lieu de "rationnelles"
mais c'est la traduction qui est ainsi)

C'est excessivement puissant les RegExp quand on sait s'en servir. On peut
parfois remplacer une suite impressionnante d'instruction par une seule.
Mais c'est vrai que ça peut nuire à la lisibilité, dans ce cas il faut
beaucoup commenter, et puis, c'est assez "hard" comme approche au début
(et pendant un bon moment pour moi), mais en ce qui me concerne, je ne
regrette pas l'investissement temps, surtout que ça sert dans beaucoup de
langages.

--
Christophe PEREZ
Écrivez moi sans _faute !


Avatar
Niko
"Christophe PEREZ" s'est exprimé ainsi :

C'est excessivement puissant les RegExp quand on sait s'en servir. On peut
parfois remplacer une suite impressionnante d'instruction par une seule.
Mais c'est vrai que ça peut nuire à la lisibilité, dans ce cas il faut
beaucoup commenter, et puis, c'est assez "hard" comme approche au début
(et pendant un bon moment pour moi), mais en ce qui me concerne, je ne
regrette pas l'investissement temps, surtout que ça sert dans beaucoup de
langages.


A ce propos, qq'un aurait t-il une adresse de réference pour les RegEx
en php (simple et accessible, avec des exemples concrets commentés) ?

Niko

--
Niko
Tarmo en devenir
Enlever nospam- pour me répondre

Avatar
Stephane Santon
Bonjour,

A ce propos, qq'un aurait t-il une adresse de réference pour les RegEx
en php (simple et accessible, avec des exemples concrets commentés) ?


http://www.commentcamarche.net/php/phpreg.php3
http://www.az-php.com/?p=cours_25

--
** Anti-Spam : ajouter [usenet] dans l'objet pour ne pas être rejeté.

Cordialement, Stéphane *** http://www.team-santonum.com
Loisirs, nature, arts, technologie : accueil en Charente-Maritime