Page 1 sur 1
RegularExpression > équivalent de "preg_replace"
Publié : lun. 30/mars/2009 10:49
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.
Publié : lun. 30/mars/2009 11:37
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
Publié : lun. 30/mars/2009 11:55
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$
Publié : lun. 30/mars/2009 16:12
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.
Publié : dim. 05/avr./2009 14:49
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
Publié : sam. 02/mai/2009 11:41
par Geo Trouvpatou
Salut Lionel.
Merci pour ton lien même si je n'ai rien compris

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.
Publié : jeu. 27/août/2009 15:56
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