Petit soucis de regex


NxtGen
WRInaute impliqué
WRInaute impliqué
 
Messages: 762
Inscription: 24 Oct 2006

Petit soucis de regex

Message le Lun Aoû 24, 2009 18:15

Bonjour à tous,

Je séche un peu avec les regex :(

Voici ce que je voudrais faire :
Code: Tout sélectionner
$texte = '[quote][quote]citation1[/quote]citation2[/quote]';

j'aimerais qu'a grands coups de regex, j'obtienne :
Code: Tout sélectionner
$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: Tout sélectionner
// 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


ortolojf
WRInaute passionné
WRInaute passionné
 
Messages: 1676
Inscription: 14 Aoû 2002

Re: Petit soucis de regex

Message le Lun Aoû 24, 2009 18:49

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


RiPSO
WRInaute passionné
WRInaute passionné
 
Messages: 1591
Inscription: 4 Oct 2007

Re: Petit soucis de regex

Message le Lun Aoû 24, 2009 20:05

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:


NxtGen
WRInaute impliqué
WRInaute impliqué
 
Messages: 762
Inscription: 24 Oct 2006

Re: Petit soucis de regex

Message le Mar Aoû 25, 2009 0:09

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 [quote]blablabla[/quote], voire [quote][quote]blabla1[/quote]bblabla2[/quote], c'est pareil, comme faire pour ne garder que [quote]blabla2[/quote] ? :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 [quote][quote] 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 ;)


RiPSO
WRInaute passionné
WRInaute passionné
 
Messages: 1591
Inscription: 4 Oct 2007

Re: Petit soucis de regex

Message le Mar Aoû 25, 2009 0:23

avec plaisir ;)


ortolojf
WRInaute passionné
WRInaute passionné
 
Messages: 1676
Inscription: 14 Aoû 2002

Re: Petit soucis de regex

Message le Mar Aoû 25, 2009 9:02

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


ortolojf
WRInaute passionné
WRInaute passionné
 
Messages: 1676
Inscription: 14 Aoû 2002

Re: Petit soucis de regex

Message le Mar Aoû 25, 2009 9:09

Mmmmmhhhhh...

J'ai encore ramené ma fraise. ;(

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

Amicalement.

Jean-François Ortolo


NxtGen
WRInaute impliqué
WRInaute impliqué
 
Messages: 762
Inscription: 24 Oct 2006

Re: Petit soucis de regex

Message le Jeu Aoû 27, 2009 8:27

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: Tout sélectionner
$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 ?


ortolojf
WRInaute passionné
WRInaute passionné
 
Messages: 1676
Inscription: 14 Aoû 2002

Re: Petit soucis de regex

Message le Jeu Aoû 27, 2009 9:06

NxtGen a écrit: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: Tout sélectionner
$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


NxtGen
WRInaute impliqué
WRInaute impliqué
 
Messages: 762
Inscription: 24 Oct 2006

Re: Petit soucis de regex

Message le Jeu Aoû 27, 2009 9:38

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)


ortolojf
WRInaute passionné
WRInaute passionné
 
Messages: 1676
Inscription: 14 Aoû 2002

Re: Petit soucis de regex

Message le Jeu Aoû 27, 2009 10:06

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


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :

Consultez la description détaillée des produits ou services de Google suivants : JotSpot

  • Synthèse du référencement Google
    Cet outil vous donne un petit résumé de l'état de référencement de votre site dans Google.
  • Détection de pages dupliquées
    Cet outil vous permet de calculer la similarité entre 2 pages web. L'algorithme utilisé repose sur l'analyse des occurrences des mots (mais pas sur leur positionnement dans les pages). Google utilise cette notion à certains endroits dans son algorithme, mais de façon bien plus évoluée que ce petit outil... Avoir des pages trop similaires peut entraîner des problèmes d'indexation... Cet outil vous permettra peut-être de résoudre certains problèmes de contenus dupliqués.


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités