8791 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je me casse la tête depuis 2 jours sur un truc qui doit surement être tout bête...
Je souhaite dans une chaine extraire toute sous chaine type URL qui n'est pas balisé par du bbcode pour rajouter justement les balises bbcode qui vont bien.

J'utilise ces 2 expressions régulières :

$texte = preg_replace( "`^((http)+(s)? [decu]//)|(www\.))((\w|\.|\-|_)+)(/)?(\S+)?`i", "[url]http\\3://\\5\\6\\8\\9[/url]", $texte);	
	$texte = preg_replace( "`(([^\]]{1}http)+(s)? [decu]//)|(www\.))((\w|\.|\-|_)+)(/)?(\S+)?`i", "[url]http\\3://\\5\\6\\8\\9[/url]", $texte);


La 1ere fait le remplacement si l'url est trouvée en début de chaine, celle ci fonctionne, pas de problème... Dans la 2nde, j'essaie de trouver le même motif en indiquant que je ne veux pas qu'avant le "http" il y ait de crochet fermant "]"... Mais ça ne fonctionne pas...

Le but final étant que si les utilisateurs oublient de mettre les urls entre les balises bbcode Smiley url [/url] que cela les ajoute en auto lors de l'affichage du message enregistrer...

Merci d'avance pour toute idée, je suis à sec...
Modifié par Miky76 (26 Jan 2012 - 21:59)
J'ai du mal à interpréter l'intégralité de l'expression régulière et le remplacement souhaité, mais comme tu dis que ça marche dans la première expression, ça n'est pas le problème.

Concernant la seconde, donc, je m'intéresse seulement à ce qui la différencie, soit
[^\]]{1}

et je remarque deux choses :

1. je ne vois de toutes façons pas l'intérêt du {1} qui, à mon sens, n'apporte rien : avec ou sans lui, on cherche la présence d'un caractère unique, qui soit n'importe quoi sauf "]"
2. tu ne dis pas en quoi précisément "ça ne fonctionne pas" : ça ne serait pas que le remplacement "bouffe" ce fameux caractère unique avant "http" ?

Si c'est bien ça, il faudrait remplacer
(([^\]]{1}http)+(s)? [decu]//)|(www\.))

par
((([^\]])http)+(s)? [decu]//)|(www\.))


et remplacer
" url http\\3://\\5\\6\\8\\9[/url]"

par
"\\3 url http\\4://\\6\\7\\9\${10}[/url]"


En espérant que je ne suis pas complètement à côté de la plaque...
Pour tout dire j'ai contourné le souci depuis, mon but étant de mettre entre balise bbcode url les adresses qui n'y était pas, j'ai ajouté les bbcode url sur toutes les adresses existantes via la 1ere expression sans le ^ du début (pour prendre toutes les occurences, pas seulement celle en début de chaine), et viré les doublons de balises url ensuite via un str_replace... Du coup c'est pas très propre, mais ça fonctionne et très pressé par le temps...

En tout cas, merci pour ton message, j'aurais appris des choses sur les motifs, genre les crochets délimitent l'expression contenu, pas plusieurs fois possible sans parenthèse (enfin je crois avoir compris du moins !), et la numérotation des arguments du motif correspondant à l'ordre d'apparition des parenthèses... Je suis un vrai débutant avec ces expressions régulières, j'ai pris le motif sur la toile sans rien essayer d'y comprendre car il fonctionnait comme je le souhaitais, au départ... après l'agrémenter de modifs c'est une autre paire de manche...