Creation de liens automatique

Signaler
Messages postés
584
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
-
Messages postés
584
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
-
Bonjours a tous j'essaie de me faire une fonction qui me permettrait de convertir les adresses en hyperlien mais je n'arrive pas a une sans bugs... peut-etre que quelqu'un peut m'aider ?

Voici ce que j'ai a ce point.
function mkurl($adr, $mailto false, $irc false)
{
    $adr = eregi_replace('(((ftp|http|https)://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)','[\\1 \\1]', $adr);
    $adr = eregi_replace('([[:space:]()[{}])(www\.[-a-zA-Z0-9@:%_\+.~#?&//=]+)','\\1\\2', $adr);
    $adr = ($mailto) ? mkmailto_url($adr) : $adr;
    $adr = ($irc) ? mkirc_url($adr) : $adr;
    return substr($adr, 1);
}

Et voici un test qui prouve que je ma fonction est incomplete

echo mkurl('

www.test.com http://www.lesouterrain.com wwwowww test.12@lesouterrain.com irc://irc.dal.net:6667/yo?ya www.lesouterrain.com ', true, true));

En fait ce qu'il me manque c'est de faire un test supplementaire qui verifie que l'adresse n'est pas deja transformé en lien, mais je n'ai aucune idée comment m'y prendre...

<hr size="2" width="100%" />  zen69 aka Ortho Le Profett
  [site web]

4 réponses

Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
17
Salut,

Est-ce que tu pourrais préciser un peu à quoi est censé ressembler le contenu de la variable $adr que tu passes en argument de ta fonction ?
Et qu'est-ce que tu veux obtenir précisément ?

A tous les coups, ça se fait avec une seule PCRE, encore faut-il savoir exactement ce que tu as en entrée et ce que tu veux en sortie...

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
Messages postés
584
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
1
Si tu regardes bien j'ai un exemple d'utilisation en dessous de ma fonction...

Le contenu : Cette $adr est en fait un texte entier pouvant etre tres long...
Le resultat voulu : Le même texte mais avec toute les adresse convertie en liens.
    eg:
          www.lesouterrain.com -> devient -> site web]
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
17
Euh oui, j'ai justement bien regardé, et quand je voyais ce que tu passais en argument, ça me laissait perplexe.
Parce que tu dis justement que www.lesouterrain.com devient [..... ....], mais le premier argument que tu asses à ta fonction mkurl est :


www.test.com http://www.lesouterrain.com wwwowww
test.12@lesouterrain.com irc://irc.dal.net:6667/yo?ya www.lesouterrain.com

Excuse-moi de me perdre dans cette chaine : je ne sais pas ce que tu dois transformer dans tout ça...

Et je te demandais pas un exemple, mais une description précise de ce que tu veux faire. Parce que justement, ton exemple...
Bref...

Si tu veux simplement transformer un www.domaine.tld en html cliquable avec un attribut target, c'est pas très très compliqué. Ton problème de transformation d'adresse déjà mise en forme, j'avais bien compris : il est du à une mauvaise utilisation des expression régulières, et au fait que tu n'utilises pas la bonne fonction pour ça.

Essaie ça :
function mkurl($sText, $mailto = false, $irc=false) {
$search = array('`\s(?:http://|(www\.))([^\s]+)`i');
$replace = array('$1$2');
if ($mailto) {
$search[] ='`([\w\.\-_]{2,}@(?:[\w-]{2,}\.)+[\w]{2,}\s)`i';
$replace[] = '[mailto:$1 $1]';
}
if ($irc) {
$search[] = '`irc://([\w\.-]+\.[a-z]{2,}(?:\:[0-9]{1,5})?)`i';
$replace[] = '[irc://$1 $1]';
}

return preg_replace($search, $replace, $sText);
}

Je n'ai pas fait de tests approfondis, donc je ne sais pas si c'est ce qu'il y a de plus efficace et de moins consommateur en ressources.
A priori ça marche. Y compris sur les URL accentuées.

Ca doit chopper les url comme celles-ci :

www.mondomaine.tld
http://sous.domaine.tld
http://sous.domaine.tres.loin.en.dessous.tld
www.mon.super.domaine.que.j-en.suis.trop.fier.tld
www.fier.d.être.geek.tld

Mais pas :

www.mon.domaine.invalide-tld

Pour les mails, ça capture :

mon.email@domaine.tld
mon.email@mon.super.domaine.que.j-en.suis.trop.content.tld
em@il.com

Mais pas :

mon.email@i.com
mon.email@domaine.invalide-tld

Pour les liens irc, ça capture :

irc://mon.serveur.tld:12345
irc://mon.serveur.tld

Mais pas :

irc://mon.s:12345
irc://mon.s-rv

Les PCRE ne sont peut-être pas parfaites, elles laissent peut-être passer des trucs qu'elles ne devraient pas, ou l'inverse...

Pour des explications sur les PCRE :
- http://fr.php.net/manual/fr/book.pcre.php
- http://fr.php.net/manual/fr/reference.pcre.pattern.syntax.php
- http://www.lumadis.be/regex/tuto_pcre.php

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
Messages postés
584
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
1
C'est presque ca... mais il y a tout de meme un bug.

ceci est ma ligne de test

echo encode_email(mkurl('

www.test.com http://www.lesouterrain.com wwwowww j.bonnier@lesouterrain.com irc://irc.dal.net:6667/yo?ya www.lesouterrain.com ', true, true));

et la fonction que tu m'as suggéré crée le meme bug que celle que javais.
www.lesouterrain.com
cette partie du texte passer en parametre creer un mauvais url.

en fait ce que je cherche a faire, c'est quelque chose qui me permet d'ajouter les balises site web]