[PHP][REGEX]réduire le texte d'un lien dans une chaine

réduire le texte d'un lien dans une chaine [PHP][REGEX] - PHP - Programmation

Marsh Posté le 18-09-2007 à 23:43:18    

:hello:
 
je bute sur un problème de regex.
je cherche à réduire le texte qui s'affiche dans un lien.
 
exemple :
je cherche à remplacer :

Code :
  1. <a href="http://www.monsite_tres_tres_tres_long.com">http://www.monsite_tres_tres_tres_long.com</a>


 
par :

Code :
  1. <a href="http://www.monsite_tres_tres_tres_long.com">http://www.monsite...</a>


 
pour l'instant, la seule chose que j'arrive à faire c'est supprimer complètement le lien (regex toute faite) et garder le texte vierge :

Code :
  1. preg_replace('/<a href="(.*?)">(.*?)<\\/a>/i', '$2', $chaine)


 
j'ai cru comprendre que le '$2' , comme deuxième argument de preg_replace, renvoie à (.*?), mis en gras ci dessus.
 
ensuite, je peux rajouter le lien, grace à une fonction trouvée sur php.net/preg_match :

Code :
  1. preg_replace("/\s(([a-zA-Z]+:\/\/)([a-z][a-z0-9_\..-]*
  2. [a-z]{2,6})([a-zA-Z0-9\/*-?&%]*))\s/i", " <a href=\"$1\">$3</a> ", $chaine);


 
là, je dois agir sur le $3, mais je ne sais pas comment en réduire la longueur...
 
pour résumer,  
comment je peux faire pour garder le lien (attribut href) entier, mais réduire le texte affiché ?
 
je sèche un peu ... :??:  
 
merci de votre aide :jap:


Message édité par nabbo le 19-09-2007 à 00:11:11
Reply

Marsh Posté le 18-09-2007 à 23:43:18   

Reply

Marsh Posté le 19-09-2007 à 08:53:20    

Code :
  1. preg_replace('/<a href="(.*?)">\\1<\/a>/ie', "<a href='$1'>".( strlen($1)>20?substr($1,1,20)."...":$1)."</a>", $chaine);


ou un truc dans le genre


Message édité par anapajari le 19-09-2007 à 08:54:47
Reply

Marsh Posté le 19-09-2007 à 15:45:24    

euh...
parse error : il comprend pas le $1... et moi non plus
 
c'est ce genre de choses que j'avais testé, mais sans succès.
apparemment, ce système est utilisé sur ce forum (HFR) pour écourter les liens...
 
d'autres suggestions ?
 

Reply

Marsh Posté le 19-09-2007 à 16:05:44    

bon.... j'ai un semblant de réponse :
 
j'arrive à remplacer un lien comme il faut :

Code :
  1. $string='<a href="http://www.monsite_tres_tres_tres_long.com">http://www.monsite_tres_tres_tres_long.com</a>';
  2. $matches=array();
  3. preg_match('/<a href="(.*?)">\\1<\/a>/ie',$string,$matches);
  4.  
  5. echo preg_replace('/<a href="(.*?)">(.*?)<\\/a>/i', '<a href="'.$matches[1].'">'.(strlen($matches[1])>20?substr($matches[1],0,20)."[...]":$matches[1])."</a>", $string);


 
ca, ca a l'air de marcher.
 
maintenant, si j'ai plusieurs liens... ca ne marche plus... à cause du $matches[1], il remplace tout par le même mot/site.

Code :
  1. $string='<a href="http://www.monsite_tres_tres_tres_long.com">http://www.monsite_tres_tres_tres_long.com</a> blablabla mon super site <a href="toto">mon deuxième super site</a>';
  2. $matches=array();
  3. preg_match('/<a href="(.*?)">\\1<\/a>/ie',$string,$matches);
  4.  
  5. echo preg_replace('/<a href="(.*?)">(.*?)<\\/a>/i', '<a href="'.$matches[1].'">'.(strlen($matches[1])>20?substr($matches[1],0,20)."[...]":$matches[1])."</a>", $string);


 
écrase les deux valeurs avec  : http://www.monsite_tres_tres_tres_long.com
 
comment faire correspondre tout ca avec preg_replace ?
 
merci :jap:


Message édité par nabbo le 19-09-2007 à 16:12:26
Reply

Marsh Posté le 19-09-2007 à 17:28:49    

nabbo a écrit :

euh...
parse error : il comprend pas le $1... et moi non plus


\\1 à la place, désolé l'habitude du perl.
voir la page de doc sur l'utilisation de l'option e

Reply

Marsh Posté le 19-09-2007 à 17:39:24    

ca ne marche pas mieux...
où est ce que je dois le placer ?
d'après la doc, le $n se place dans le code, le \\1 se place dans la regex... mais je comprends pas quand même...

Reply

Marsh Posté le 19-09-2007 à 17:58:13    

http://fr.php.net/preg_replace
 
Exemple 1878. Utilisation de l'option 'e'
 
<?php
preg_replace("/(<\/?)(\w+)([^>]*> )/e",  
             "'\\1'.strtoupper('\\2').'\\3'",  
             $html_body);
?>  


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed