RegularExpression > équivalent de "preg_replace"

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

RegularExpression > équivalent de "preg_replace"

Message par Geo Trouvpatou »

Salut.

Etant donné que Fred traine dans le coin ces derniers temps, j'en profite pour poser cette question.

Comment avoir l'équivalente de "preg_replace" en PB

En PHP avec ce type de code :

Code : Tout sélectionner

$chaine = preg_replace('/\[b\](.+?)\[\/b\]/','<b>\\1</b>',$chaine);
$chaine = preg_replace('/\[color=(.+?)\](.+?)\[\/color\]/','<font color="\\1">\\2</font>',$chaine);
Cela permet de faire des chercher-remplacer complexe du genre :

Code : Tout sélectionner

Voici un mot en [color=#FF0000]rouge[/color] et un mot en [b]gras[/b]
qui devient :

Code : Tout sélectionner

Voici un mot en <font color="#FF0000">rouge</font> et un mot en <b>gras</b>
Je sais que certains se sont un peu cassé les dents sur cette bibliothèque : RegularExpression

Bye.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

peut etre
String$ = ReplaceString(Chaine$, ChaineCherchee$, ChaineRemplacee$ [, Mode [, PositionDepart]])
Description

Substitue toutes les occurrences de 'ChaineCherchee$' trouvées dans 'Chaine$' par 'ChaineRemplacee$'. Le paramètre 'PositionDepart' est facultatif et permet de spécifier à partir de quel caractère le remplacement doit être effectué. Sa valeur minimale est 1.

Le paramètre 'Mode' est facultatif et peut être une combinaison des valeurs suivantes:
#PB_String_NoCase : Recherche les occurrences sans tenir compte de la casse (A=a). Par défaut la recherche est sensible à la casse.
#PB_String_InPlace: Remplacement direct dans la Chaîne de caractères initiale 'Chaîne$'. Dans ce cas,
'ChaineRemplacee$' doit absolument avoir la même taille que 'ChaineCherchee$'.
C'est une fonctionnalité pour programmeurs expérimentés qui ont besoin d'une fonction
extrêmement rapide pour ce cas particulier. Quand cette option est utilisée, le résultat renvoyé par ReplaceString() doit être
ignoré (car c'est la chaîne de caractères passée en paramètre qui est modifiée).

Exemple:

Debug ReplaceString("This is Art", " is", " was") ; Affichera "This was Art"
Debug ReplaceString("Hello again, hello again", "HELLO", "oh no...", #PB_String
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

un exemple qui repond a ton probleme :)

Code : Tout sélectionner

phrase$="Voici un mot en [color=#FF0000]rouge[/color] et un mot en [B]gras[/B]"

CallDebugger
Restore a_remplacer
For i=1 To 2 
    Read.s ChaineCherchee$
  Read.s ChaineRemplacee$
sortie$ = ReplaceString(phrase$, ChaineCherchee$, ChaineRemplacee$) 
phrase$=sortie$
    Debug sortie$
Next i




DataSection
a_remplacer :
Data.s "[","<","]",">"  ; mettre le caractère a remplacer, suivi du caractère qui remplace !
; ***********************************
EndDataSection

autre technique :

Code : Tout sélectionner

phrase$="Voici un mot en [color=#FF0000]rouge[/color] et un mot en [B]gras[/B]"

CallDebugger

CreateRegularExpression(0, "[[]")
CreateRegularExpression(1, "[]]")

result$ = ReplaceRegularExpression(0,phrase$, "<")
result$ = ReplaceRegularExpression(1,result$, ">")
    Debug result$ 
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Message par Geo Trouvpatou »

Salut Dobro.

Hélas les solutions que tu proposes ne permettent de ne faire que de petites modifs pas trop complexes.

Par exemple pour COLOR, les guillemets ont disparus.

Et remplacer ] par > du coup ne fonctionne pas pour tout :
exemple :

[color=#FF0000] devrait devenir <font color="#FF0000">
[b] devrait devenir <b>
Et pour un smiley par exemple :
[[1]] devrait devenir <img src="images/smileys/1.gif" align="bottom" alt="" />

Donc tu vois qu'à chaque fois ] à une transformation différente.

C'est pour ça que preg_replace permet de gérer tout ça.

J'ai tout de même appris quelque chose dans chacun de tes 2 codes.
Et au passage pour ton 2ème code, ne peut-on pas simplement echapper les caractères [ et ] comme ceci :
CreateRegularExpression(0, "\[")
CreateRegularExpression(1, "\]")

Bye.
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

salut Geo Trouvpatou,

Je me suis déjà heurté à ce problème. Malheureusement aucune vrai solution n'existe. Néanmoins une personne sur le forum anglais à trouver une façon détournée. C'est pas super propre mais bon:
http://www.purebasic.fr/english/viewtop ... highlight=.

/Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Message par Geo Trouvpatou »

Salut Lionel.

Merci pour ton lien même si je n'ai rien compris :lol:
Sinon, je suis tombé sur celui-ci :
http://www.purebasic.fr/english/viewtop ... ight=regex

Mais le problème c'est que cela ne fonctionne qu'une seule fois.
Si tu as :
Define subject.s = "<a href='http://www.pcre.ru/bla'>text</a> blablabla <a href='http://www.pcre.ru/bla'>text</a> bliblibli"
au lieu de :
Define subject.s = "<a href='http://www.pcre.ru/bla'>text</a>"
Cela merdouille.
A la rigeur il faudrait diviser le truc en plusieurs chaînes, mais que chaque chaînes, ne contiennent qu'une seule fois : "<a href='http://www.pcre.ru/bla'>text</a>

Mais bon je verrais ça plus tard, et pour mon cas perso, au pire je ferais ça via PHP.

Bye.
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Message par Geo Trouvpatou »

Il y a quelques jours je m'étais remis sur ce problème et voici quelque chose qui m'a l'air fonctionnel, à défaut d'avoir un code comme dans mon post précédent qui lui, se rapproche plus d'un preg_replace.

Mais bon mon code remplace aussi bien les [ color=#000000 ] que les [ color=Green ].
C'est peut-être améliorable, ou il y a peut-être un dysfonctionnement que je n'ai pas vu, mais pour mon parsage de bbcode ça devrait le faire.

Code : Tout sélectionner

EnableExplicit
Define MaChaine$, nbExpressionTrouvee.i, k.i

If CreateRegularExpression(0, "\[color=[a-zA-Z0-9\-\#]+\]")

    Dim resultat$(0)
    Debug "Extraire le BBCode [color=#000000]xxx[/color] :"
    
    MaChaine$ = "un peu de texte [color=#000000]pour [color=#111111]tester[/color] et du [b]texte[b] collé[color=Green]en mettant Green[/color] [color=#FFFFFF]encore du bla bla[/color]"
    Debug MaChaine$
    nbExpressionTrouvee = ExtractRegularExpression(0, MaChaine$, resultat$())

    For k = 0 To nbExpressionTrouvee - 1

        ; On isole le texte aléatoire. 
        ; De [color=#000000] on veut #000000
        ; Ou de [color=green] on veut green
        resultat$(k) = resultat$(k)
        resultat$(k) = RemoveString(resultat$(k), "[color=") 
        resultat$(k) = RemoveString(resultat$(k), "]") 
        ;Debug "Etape 1 : "+ resultat$(k)
        
        ; On remplace le texte
        ; On fait un ReplaceString uniquement sur [color= en sachant qu'il n'y aura pas de conflit avec un autre 
        ; BBCode, et on préfère remplacer le texte aléatoire au niveau du crochet fermant.
        MaChaine$ = ReplaceString(MaChaine$, "[color=", "<font color="+ Chr(34) +"")
        ;Debug "Etape 2 : "+ MaChaine$
        
        ; Ici il vaut mieux faire un ReplaceString sur le texte aléatoire + le crochet fermant, 
        ; parce que si on avait dit de remplacer uniquement le "]" cela poserait problème 
        ; pour les crochets fermants des autres BBCodes comme [b] [i] etc...
        MaChaine$ = ReplaceString(MaChaine$, resultat$(k) +"]", resultat$(k) + Chr(34) +">") 
        ;Debug "Etape 3 : "+ MaChaine$
        
    Next
    
    Debug Str(nbExpressionTrouvee)+" BBCode(s) ont été trouvées."
    
    ; On parse [/color] et on le remplace par </font> puisqu'il n'y pas de risque de conflit avec un autre BBCode
    MaChaine$ = ReplaceString(MaChaine$, "[/color]", "</font>")
    
    Debug MaChaine$
    
Else
    Debug RegularExpressionError()
EndIf
Répondre