Petit soucis de regex

  • Auteur de la discussion Auteur de la discussion NxtGen
  • Date de début Date de début
WRInaute impliqué
Bonjour à tous,

Je séche un peu avec les regex :(

Voici ce que je voudrais faire :
Code:
$texte = '[quote][quote]citation1[/quote]citation2[/quote]';
j'aimerais qu'a grands coups de regex, j'obtienne :
Code:
$texte = '[quote]citation2[/quote]';

Le principe étant de supprimer les citations imbriquées les unes dans les autres sur mon forum.

Pour l'instant j'ai :
Code:
// Récupére toutes les citations
$match_count = preg_match_all("#\[quote\](.*?)\[/quote\]#is", $text, $matches);
for ( $i=0; $i<$match_count; $i++ ) {

     // Remplace les citation imbriquées
     $innertext = preg_replace("#\[quote\](.*?)\[/quote\]#is", '', $matches[1][$i]);
     }

mais ca n'a pas l'air de fonctionner terrible :(
Quelqu'un aurait une idée ?

Merci
 
WRInaute accro
Bonsoir

Une fonction récursive ?

Cà me donne l'impression d'une logique récursive.

Mais avec preg_replace() , ça devrait coller, non ?

Je ne connais pas preg_replace(), ni les fonctions type PCRE.

Amicalement.

Jean-François Ortolo
 
WRInaute impliqué
pour moi c'est pas possible à coup de regex je pense...
y'a tellement de maniere d'imbriquer les quotes dans les autres quotes, de mettre un truc entre deux quote... etc...

mais le plus simple je pense c'est que quand quelqu'un clic sur un bouton "citer" pour repondre, tu devrais retirer tout ce qui est quoté dans le message cité et dans ce cas il te restera que la reponse du gars cité. Dur a expliquer :mrgreen:
 
WRInaute impliqué
Ben ca reviens exactement à faire ce que je veux loul
et c'est bien la le soucis, c'est que je ne sais pas comment faire ça ^^

Le gars clique sur "citer", donc le textarea est prérempli avec
, voire
, c'est pareil, comme faire pour ne garder que
? :mrgreen:

Edit : a ben non ca revient pas au même en fait, t'as raison ca peut marcher :wink:

Edit 2 : avec tout ces
va y avoir de la pub pour le blanc de poulet sur WRI :D

Edit 3 : Ayé mis en place et ca fonctionne achement bien Merci ;)
 
WRInaute accro
Avec une fonction récursive...

Compte tenu du fait que les balises \[quote\] et \[/quote\] sont "nestées" :

Dans ce qui suit, les variables indices $i et la variable indicée, sont globales.

- Condition d'appel à la fonction récursive ( même à partir de celle-ci ) : rencontrer le token ouvrant \[quote\], ce qui donne lieu à l'élimination de ce token de la chaîne de caractère lue.

- La logique de présentation de cette chaîne de caractère au départ, suppose qu'elle commence par le token \[quote\], qui précède tout texte antérieur, théoriquement. Dites-moi si je me trompe.

- Traitement dans la fonction récursive : incrémenter un indice $i par exemple, et mettre dans une variable indicée le contenu du reste de la chaîne de caractère, jusu'au premier token \[quote\] ou \[/quote\] non compris.

- Au cours du traitement dans la fonction récursive, l'un des deux tokens \[quote\] ou \[/quote\] peut être rencontré.

- Si le token \[/quote\] est rencontré, on l'enlève de la chaîne de caractères, et on sort de la fonction récursive avec un return.

- Si le token \[quote\] est rencontré, on l'enlève de la chaîne de caractère, et on appelle de nouveau la même fonction ( récursive ).

- Quand la chaîne de caractère a été parcourue jusqu'au bout, le nombre de balises ouvrantes fermantes rencontrées, est le même, puisque ces balises sont "nestées".

-----------------------------------

En fait, j'ai moi-même eu à programmer quelque chose d'équivalent pour du parsing de texte html, où la condition d'entrée était de rencontrer la balise \<table ...\> ou " ... " peut être n'importe quoi, et la condition de sortie était de rencontrer la balise fermante \</table\>

Je me suis débrouillé avec deux fonctions non récursives, mais le traitement était assez complexe, avec des if-else etc... ;)

Je suis désolé de na pas communiquer ou adapter ces fonctions. En gros, la philosophie est de faire tel ou tel traitement dans les cas suivants:

\<table \> suivi de contenu suivi de \</table\>
\<table \> suivi de contenu suivi de \<table \>
\</table\> suivi de contenu suivi de \<table \>
\</table\> suivi de contenu suivi de \</table\>

Amicalement.

Jean-François Ortolo
 
WRInaute accro
Mmmmmhhhhh...

J'ai encore ramené ma fraise. ;(

Je n'avais pas lu les précédents messages.

Amicalement.

Jean-François Ortolo
 
WRInaute impliqué
Merci pour ton message même si je n'ai pas tout compris ^^
par contre, il existe un moyen simple pour ton cas avec les <table> en regex

Code:
$match_count = preg_match_all("#<table([^>]*)>(.*)<\/table([^>]*)>#isU", $variable, $matches);

avec ca tu récupére sans soucis
<table>contenu</table>
<table class="red">contenu</table>
<TABLE >contenu</table >

([^>]*) dans la regex signifie "tout sauf '<'" ce qui correspond bien à ce que tu voulais faire non ?
 
WRInaute accro
NxtGen a dit:
Merci pour ton message même si je n'ai pas tout compris ^^
par contre, il existe un moyen simple pour ton cas avec les <table> en regex

Code:
$match_count = preg_match_all("#<table([^>]*)>(.*)<\/table([^>]*)>#isU", $variable, $matches);

avec ca tu récupére sans soucis
<table>contenu</table>
<table class="red">contenu</table>
<TABLE >contenu</table >

([^>]*) dans la regex signifie "tout sauf '<'" ce qui correspond bien à ce que tu voulais faire non ?


Bonjour Monsieur

Le problème, c'est qu'il était éventuellement possible théoriquement, que plusieurs tables soient imbriquées l'une dans l'autre. ( C'est le cas ici ). Et également, il y avait un risque, pour que ces balises ne soient pas "nestées", sans oublier le bug ou le nombre de balises ouvrantes, ne soit égal au nombre de balises fermantes...

En fait, j'ai tenu compte de tous les cas, en partant d'une acquisition de données peu fiable. ;(

Merci beaucoup pour votre réponse. ;)

Amicalement.

Jean-François Ortolo
 
WRInaute impliqué
Effectivement j'avais oublié qu'à la base, mon problème c'était les balises imbriquées, et effectivement je ne suis pas sur que ma solution fonctionne dans ce cas (en tout cas pas sous cette forme)
 
WRInaute accro
Bonjour

Je ne connais rien aux motifs de caractères PCRE ( preg_replace() et autres ).

J'ai lu il y a longtemps, le livre "Algorithms in C" de Robert Sedgewicz, par l'éditeur Addison Wesley.

Anglais facile à lire... ;)

Dedans, il y avait le problème des algorithmes récursifs, la façon de les "dérécursiver" ( que je n'ai pas appliquée dans ce problème que j'avais ), et plein d'informations scientifiques très intéressantes.

Je conseille ce livre ( je le lisais avant 1991 et aussi après ), à quiconque veut acquérir un peu de connsaissance théoriques en Informatique.

Très bon bouquin, très didactique et pédagogique...

Votre problème, me paraît avoir une logique récursive.

C'est possible ( je ne sais pas ), qu'avec des preg_replace() il soit possible de résoudre le problème facilement.

Il faudrait s'adresser au newgroup adapté pour cela, je ne me souviens plus duquel.

Amicalement.

Jean-François Ortolo
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut