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 14/05/2007, 21h31   #1
Membre du Club
 
Inscription : décembre 2004
Messages : 193
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2004
Messages : 193
Points : 59
Points : 59
Par défaut faire un lien depuis une URL postée

Bonsoir @ tous,

Je souhaite une fois que j'ai récupérer le contenu d'un post afficher le résultat. Et si dans le contenu, il y a une URL, je souhaite la rendre cliquable.

jusqu'ici tout va bien et voila ce que je fais :
Code :
$sHtml = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]","<a href=\"\\0\" class=\"lien\" target=\"_blank\">\\0</a>", $sHtml);
Dans ce cas si l'on envoie http://www.bob.fr, ca le transforme en lien.
Moi ce que je voulais c'est que cela fasse la meme chose si l'on envoie que www.bob.fr alors j'ai esayer de faire de couplé le code ci-dessus avec un autre ereg_replace : "www[^<>[:space:]]+[[:....." mais evidement ca se mélange les pinceaux.

Donc si vous aviez une solution à mon problème, ce serait génial...
Merci
jexl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2007, 09h37   #2
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Bonjour,

Tu peux rendre, dans ton pattern, le http:// comme étant facultatif et devant apparaître 0 ou 1 fois:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
<?php
$sHtml = "http://www.developpez.com";
echo "Avec http : " . $sHtml . "<br/>";
$sHtml = ereg_replace("([[:alpha:]]+://)?[^<>[:space:]]+[[:alnum:]/]","<a href=\"\\0\" class=\"lien\" target=\"_blank\">\\0</a>", $sHtml);
echo "Avec http (apres conversion) : " . $sHtml . "<br/>";
$sHtml = "www.developpez.com";
echo "Sans http : " . $sHtml . "<br/>";
$sHtml = ereg_replace("([[:alpha:]]+://)?[^<>[:space:]]+[[:alnum:]/]","<a href=\"\\0\" class=\"lien\" target=\"_blank\">\\0</a>", $sHtml);
echo "Sans http (apres conversion) : " . $sHtml . "<br/>";
?>
Par contre ca semble poser un problème, chez moi le lien n'est pas valide s'il n'y a pas http:// devant.
dans ce cas il faut a mon avis que tu fasses plusieurs cas mais sans les combiner. Tu detectes dans quel cas tu es par un preg_match (http://www ou http:// sans www, ou encore juste www.) et ensuite tu fais ton ereg_replace()
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2007, 22h33   #3
Membre du Club
 
Inscription : décembre 2004
Messages : 193
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2004
Messages : 193
Points : 59
Points : 59
Je me doutais que ce ne serait pas si simple que ca... Et puis les expressions régulières et moi, ca fait plusieurs !
Je vais essayer de chercher une solution.

En tout cas merci.
Schuss
jexl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2007, 08h39   #4
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
Essaye celle la :
Code php :
preg_replace('#([a-z]+://)?(www.)?[a-z0-9-_]+\.[a-z]{2,4}(?:[^.]+\.[a-z0-9]+)?#i', '<a href="$0" class="lien" target="_blank">$0</a>', $sHtml);

Si elle te convient, je pourrais toujours te l'expliquer
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2007, 12h32   #5
Membre du Club
 
Inscription : décembre 2004
Messages : 193
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2004
Messages : 193
Points : 59
Points : 59
Merci Korco,


Afin d'y apporter la denière modifcation qui me donnera entière satisfaction : transformer tous les www. en http://www. dans le href pour que tous les liens fonctionnent.
Je veux bien que tu m'expliques le fonctionnement de cette expression régulière. Voici ce que je pense avoir compris

Code :
1
2
 
preg_replace('#([a-z]+://)?(www.)?[a-z0-9-_]+\.[a-z]{2,4}(?:[^.]+\.[a-z0-9]+)?#i', '<a href="$0" class="lien" target="_blank">$0</a>', $sHtml);
([a-z]+://)?(www.) pour tout ce que commence par http:// ou www.

euh et après j'suis largué
jexl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2007, 13h01   #6
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
Korko stp ^^

Tien voila (jlai amélioré)
Code :
1
2
3
4
5
6
preg_replace_callback('#([a-z]+://)?(?:www.)?[a-z0-9-_]+(?:\.[a-z]{2,4})+/?(?:[a-z0-9-_%/]+\.[a-z0-9]+)?(?:\?[^\s]*)?#i', 'make_link', $sHtml);
 
function make_link($match)
{
	return '<a href="'.(empty($match[1])) ? 'http://'.$match[0] : $match[0].'" class="lien" target="_blank">'.$match[0].'</a>';
}
Pour l'explication, la voila :
Citation:
Tout dabord, les # #i sont juste la pour encadrer l'expression et le i veux dire que si tu met un A au lieu d'un a ça fonctionne aussi.
Ensuite, les (?: ) c'est pour délimiter une zone (qui permet d'utiliser le ? pour 0 ou 1, le * pour 0 ou plus et le + pour 1 ou plus

([a-z]+://)? => n'importe quelle suite de lettre suivies de "://" ce qui inclu http:// ftp:// https:// et j'en passe. C'est optionnel (le ?)
(www.)? => La chaine "www." optionnelle
[a-z0-9-_]+ => n'importe quelle suite de lettre, chiffres, tiret et tiret bas
(\.[a-z]{2,4})+ => Nom de domaine : un point suivi d'une suite de 2 à 4 lettre (de .fr le plus court à .info le plus long), attention en cas de .fr.st par exemple
[a-z0-9-_%/]+ => une suite quelconque de lettres, de chiffres, de % de tiret, de tiret bas et de slash.
\.[a-z0-9]+ => l'extension si jamais c'est un fichier a savoir un point suivi d'une suite de lettres ou de chiffres
\?[^\s]* => les parametres passés au fichier exemple à savoir une suite de caractères jusqua un espace : ?toto=truc&machin=truc
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2007, 14h16   #7
Membre du Club
 
Inscription : décembre 2004
Messages : 193
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2004
Messages : 193
Points : 59
Points : 59
Oups, désolé "quorquau" pour la fote !
Bon en vrai,MERCI beaucoup Korko Fain pour les explications, j'y vois plus clair.

En revanche je comprends pas bien ce que tuveux faire avec preg_replace_callback, tu veux appeler la fonction make_link ? dans ce cas pour le faire comme s'il s'agissait d'un string ?

Autrement si j'ai bien compris, ta fonction ajoute ta fonction make_link ajoute
le http:// si il n'est pas renseigné.
jexl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2007, 14h58   #8
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
la fonction preg_replace_callback appel la méthode dite 'callback' à chaque fois que tu trouve une chaine qui correspond à ta regex. La méthode callback est soit le nom de la fonction soit un tableau contenant le nom de la classe et le nom de la méthode.

La methode callback prend en parametre le tableau de capture et doit retourner la chaine de remplacement.

Ici ça me permet d'ajouter http:// si il n'y est pas.
Korko Fain 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 06h47.


 
 
 
 
Partenaires

Hébergement Web