Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/02/2007, 17h37   #1
Membre chevronné
 
Homme Jérémy
Étudiant
Inscription : mars 2005
Messages : 634
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Âge : 24
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2005
Messages : 634
Points : 710
Points : 710
Par défaut Lien cliquable et compatibilité bbcode



Voilà j'ai encore un petit problème avec les expressions régulières. J'ai un script pour faire automatiquement des liens cliquables. Jusque là pas de problème, mais je donne aussi la possibilité de faire des lien bbocde comme [ url =x]lien[/url].

L'url est donc parsée deux fois à cause du http://.

Pour le moment j'ai le code suivant :
Code :
1
2
3
4
5
6
7
// Parse [ url ]
$text = preg_replace('#\[url=([^\]]*)\](.*)\[/url\]#Usi', '<a href="$1" title="$2">$2</a>', $text);
 
// Liens cliquables
$in = array('`((?:https?|ftp)://\S+[[:alnum:]]/?)`si', '`((?<!//)(www\.\S+[[:alnum:]]/?))`si');
$out = array('<a href="$1">$1</a>', '<a href="http://$1">$1</a>'); 
$text = preg_replace($in, $out, $text);
J'ai essayé de modifier la 2ème expression comme ça :
Code :
$in = array('`([^\]=](?:https?|ftp)://\S+[[:alnum:]]/?)`si', '`((?<!//)(www\.\S+[[:alnum:]]/?))`si');
qui est censée rechercher s'il n'y a pas de "=" ou de "]" avant (balises bbcode) mais ça ne change rien et ça affiche n'importe quoi si j'ai des balises [url] (double lien), il y a sûrement une erreur de synthaxe comme je connais pas beaucoup mais je n'ai pas trouvé mieux.

__________________
Fiquet
- FAQ SDL
- FAQ C++
Fiquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2007, 20h46   #2
Membre à l'essai
 
Inscription : décembre 2005
Messages : 22
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : décembre 2005
Messages : 22
Points : 23
Points : 23
Salut,

Pour éviter de retraiter les adresses à l'intérieur d'un [url = ], tu pourrais par exemple utiliser ça, en début de pattern, pour la fonction qui rend les liens automatiquement cliquables :
Code :
$pattern = '/(^|[\n ]) ... /'
Hansolo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 22h13   #3
Membre chevronné
 
Homme Jérémy
Étudiant
Inscription : mars 2005
Messages : 634
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Âge : 24
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2005
Messages : 634
Points : 710
Points : 710
J'ai essayé d'adapter mon code avec celui de Hansolo. Ca à l'air de fonctionner, mais lorsque le lien est au milieu du texte, la regex supprime un espace avant le lien, et le lien est collé au texte à gauche. Quelqu'un voit où est l'erreur ?

Code :
1
2
3
$in  = array('#^|[\n ]((?:https?|ftp)://\S+[[:alnum:]]/?)#si', '#((?<!//)(www\.\S+[[:alnum:]]/?))#si');
$out = array('<a href="$1">$1</a>', '<a href="http://$1">$1</a>');
$text = preg_replace($in, $out, $text);
__________________
Fiquet
- FAQ SDL
- FAQ C++
Fiquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 22h55   #4
Membre à l'essai
 
Inscription : décembre 2005
Messages : 22
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : décembre 2005
Messages : 22
Points : 23
Points : 23
Il faut garder les paranthèses du code donné plus haut et utiliser les paranthèses en début de remplacement.
Code :
$out = array('$1<a href="$2">$2</a>', '<a href="http://$1">$1</a>');
Hansolo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 22h59   #5
Membre chevronné
 
Homme Jérémy
Étudiant
Inscription : mars 2005
Messages : 634
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Âge : 24
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2005
Messages : 634
Points : 710
Points : 710
Ah oui j'avais essayé aussi avec les parenthèses mais je n'ai pas pensé à mettre le $1 en début du remplacement.

Ca marche
__________________
Fiquet
- FAQ SDL
- FAQ C++
Fiquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h31.


 
 
 
 
Partenaires

Hébergement Web