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 19/05/2006, 20h37   #1
Invité de passage
 
Inscription : octobre 2002
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 42
Points : 4
Points : 4
Par défaut Expression régulière et longueur de chaine

Salut

j'ai une expression régulière qui permet de formater une URL

Code :
1
2
3
4
5
6
 
$message = "blabla <a href="http://www.monsite.com" target="_blank">http://www.monsite.com</a> blablabla";
 
$message = eregi_replace("([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])","<a href=\"<a href="file://\\1://\\2\\3\" target="_blank">\\1://\\2\\3\</a>" target=\"_blank\" class='style'><a href="file://1:////2//3/" target="_blank">\\1://\\2\\3</a><a>",$message);
 
echo $message
Dans certains cas, l'URL est beaucoup trop longue et ça déforme toute ma mise en page,
existe t il un moyen d'afficher l'URL complète si elle fait moins de 50 car par ex, et dans le cas où elle en fait plus, d'afficher les 50 premiers car + ...

Merci
cbroissa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2006, 20h44   #2
Rédacteur/Modérateur
 
Avatar de gorgonite
 
Homme Nicolas Vallée
Ingénieur Système
Inscription : décembre 2005
Messages : 9 774
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Vallée
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Ingénieur Système
Secteur : Transports

Informations forums :
Inscription : décembre 2005
Messages : 9 774
Points : 14 303
Points : 14 303
ben il te suffit de scinder ton texte en morceau contenant au plus un lien hypertexte, tu passes ta fonction pour extrire le lien, tu compares sa longueur avec son seuil, et si besoin tu remplaces...
gorgonite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2006, 14h01   #3
Invité de passage
 
Inscription : octobre 2002
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 42
Points : 4
Points : 4
merci mais comment faire pour récupérer juste les URL ? s'il y en a plusieurs dans le message ?
cbroissa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2006, 14h15   #4
Membre Expert
 
Avatar de Anduriel
 
Homme
Étudiant
Inscription : février 2004
Messages : 2 168
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2004
Messages : 2 168
Points : 1 277
Points : 1 277
Tu peux faire un preg_replace_callback qui teste la longeur de chaine:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
function test_lenght($matches) {
   $str = $matches[1]."://".$matches[2].$matches[3];
   if (strlen($str) > 50)
      return '<a href=\"'.$str.'" target=\"_blank\" class='style'>'.substr($str, 0, 50).'...<a>';
   else
      return '<a href=\"'.$str.'" target=\"_blank\" class='style'>'.$str.'<a>';
 
}
 
$message = preg_replace_callback("([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])", "test_lenght", $message);
 
echo $message
Je ne suis pas très doué dans les expressions régulières alors ça se peut que ça ne fonctionne pas du premier coup.
Anduriel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2006, 18h59   #5
Invité de passage
 
Inscription : octobre 2002
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 42
Points : 4
Points : 4
j'ai mis exactement ton code mais ça me fait cette erreur :

Code :
1
2
3
 
Warning: preg_replace_callback(): Unknown modifier ':' in /...fichier.php on line 105
cbroissa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2006, 20h17   #6
Membre émérite
 
Inscription : juin 2002
Messages : 1 013
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 1 013
Points : 959
Points : 959
tu peux utiliser strlen pour connaître la longueur de ta chaîne
tu peux utiliser substr pour récupérer la partie gauche d'une chaîne
francis m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2006, 20h28   #7
Invité de passage
 
Inscription : octobre 2002
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 42
Points : 4
Points : 4
oui mais bon mon message c'est :

$message = "blabla http://www.monsite.com blablabla";

donc je peux pas utiliser strlen et substr pour juste récupérer l'url
cbroissa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2006, 20h38   #8
Membre émérite
 
Inscription : juin 2002
Messages : 1 013
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 1 013
Points : 959
Points : 959
je n'ai pas dit cela
j'avais cru comprendre que ton eregi_replace que je n'ai pas regardé te donne l'url dans la variable $message

après, avec strlen et substr tu limites $message à 50

si tu crois que ton eregi_replace est faux, je veux bien regarder (plus tard...)
francis m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2006, 21h38   #9
Membre Expert
 
Avatar de Anduriel
 
Homme
Étudiant
Inscription : février 2004
Messages : 2 168
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2004
Messages : 2 168
Points : 1 277
Points : 1 277
Et mettant:

Code :
$message = preg_replace_callback("([[:alnum:]]+)\://([^[:space:]]*)([[:alnum:]#?/&=])", "test_lenght", $message);
?
Anduriel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2006, 00h32   #10
Invité de passage
 
Inscription : octobre 2002
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 42
Points : 4
Points : 4
non ça ne change rien, ça fait la même erreur avec le \ à la place de :
cbroissa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2006, 01h09   #11
Membre émérite
 
Inscription : juin 2002
Messages : 1 013
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 1 013
Points : 959
Points : 959
moi je suis nul en eregi (quand j'en fais un, pour qu'il fonctionne, il me faut au moins une semaine de dur labeur et réflexion)

alors je te propose les principes suivants :

première solution :
  • avec un strpos je cherche la position de http://
  • avec substr j'efface tout ce qui est devant
  • strpos pour trouver le premier espace
  • substr pour enregistrer tout jusqu'à cet espace, cela donne le premier url, à mettre dans un tableau
  • substr pour effacer tout ce qui est devant cet espace (donc l'url)
  • et recommencer la même séquence
  • faire cela avec une boucle while
seconde solution
  • avec un explode sur les espaces pour récupérer un tableau avec tous les mots
  • faire une boucle sur le nombre d'éléments du tableau
  • ne sélectionner que les éléments qui contiennent http:// et voilà tes url
naturellement c'est bâtard pour les spécialistes des eregi, mais au moins tu peux avancer dans ton projet, et plus tard quand tu auras un peu de temps et plus d'expérience, tu te pencheras à nouveau sur les eregi
francis m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2006, 01h15   #12
Invité de passage
 
Inscription : octobre 2002
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 42
Points : 4
Points : 4
merci mais ça risque d'être vraiment lourd au niveau traitement,
c'est pour ça que je voulais régler ça par expression régulière.
cbroissa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2006, 01h27   #13
Membre émérite
 
Inscription : juin 2002
Messages : 1 013
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 1 013
Points : 959
Points : 959
cela paraît lourd mais je prétends que cela ne se verra pas sur ton temps d'exécution, sauf si tu fais 150000 recherches d'url

bon je n'ai plus envie de me fatiguer mais je verrai demain

petite remarque quand-même sur les ereg : primo, à mon avis, autant faire une recherche sur http que sur :// et secundo je ne pense pas qu'un point fasse partie de [[:alnum:]]
francis m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2006, 11h18   #14
Membre Expert
 
Avatar de Anduriel
 
Homme
Étudiant
Inscription : février 2004
Messages : 2 168
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2004
Messages : 2 168
Points : 1 277
Points : 1 277
Essaoi ça:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
$message = "Salut, <a href="http://www.killtrees.free.fr/test/index.php?id=1&php=2" target="_blank">http://www.killtrees.free.fr/test/index.php?id=1&php=2</a># test";
function test_lenght($matches) {
   $str = $matches[1]."://".$matches[2];
   if (strlen($str) > 50)
      return '<a href="'.$str.'" target="_blank" class="style">'.substr($str, 0, 50).'...<a>'.$matches[3];
   else
      return '<a href="'.$str.'" target="_blank" class="style">'.$str.'<a>'.$matches[3];
 
}
 
$message = preg_replace_callback("#(http|ftp)://([A-Za-z0-9\.\?/&\=\#]+)([[:space:]]+)#Us", "test_lenght", $message);
 
echo $message;
?>
Ca fonctionne chez moi.
Anduriel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2006, 11h47   #15
Invité de passage
 
Inscription : octobre 2002
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 42
Points : 4
Points : 4
effectivement ça fonctionne pour des url simples,
mais dès qu'il y a une variable ?var=variable, ça ne fonctionne plus.
cbroissa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2006, 13h04   #16
Membre Expert
 
Avatar de Anduriel
 
Homme
Étudiant
Inscription : février 2004
Messages : 2 168
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2004
Messages : 2 168
Points : 1 277
Points : 1 277
Dans mon exemple avec
Citation:
http://www.killtrees.free.fr/test/index.php?id=1&php=2#


Ca fonctionne.
Anduriel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2006, 13h25   #17
Invité de passage
 
Inscription : octobre 2002
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 42
Points : 4
Points : 4
j'ai testé ton lien et ça ne fonctionne pas.
cbroissa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2006, 13h58   #18
Membre Expert
 
Avatar de Anduriel
 
Homme
Étudiant
Inscription : février 2004
Messages : 2 168
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2004
Messages : 2 168
Points : 1 277
Points : 1 277
Avec exactement mon code?!
C'est bizarre... il se passe quoi alors chez toi?
Anduriel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 00h04   #19
Invité de passage
 
Inscription : octobre 2002
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 42
Points : 4
Points : 4
autant pour moi, j'avais un autre bout de code avant qui génait ton code (la fonction htmlspecialchars qui transformait le & en &amp; et donc ça ne fonctionnait plus),

maintenant ça marche mais par contre si le lien se trouve à la fin du texte, là il n'est pas remplacé,

que faut il modifier pour que cela soit prit en compte aussi ?
cbroissa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 15h48   #20
Membre Expert
 
Avatar de Anduriel
 
Homme
Étudiant
Inscription : février 2004
Messages : 2 168
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2004
Messages : 2 168
Points : 1 277
Points : 1 277
Code :
1
2
3
4
$message = preg_replace_callback("#(http|ftp)://([A-Za-z0-9\.\?/&\=\#]+)([[:space:]]+|$)#Us", "test_lenght", $message);
 
echo $message;
?>
Et comme ça? Je ne sais pas si la syntaxe est comme ça, mais ça doit pas être loin.
Anduriel 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 18h13.


 
 
 
 
Partenaires

Hébergement Web