2010-11-03 4 views
0

Devrait être assez simple pour quelqu'un qui connaît regex. Je ne suis malheureusement pas parmi ceux qui sont au courant.Regex et PHP: ajout d'ellipses après X nombre de caractères

Comment peut-on ajouter des ellipses à quelque chose de plus de 27 caractères dans l'exemple ci-dessous, de sorte que le quatrième lien répertorié apparaîtra comme http://iamanextremely.com/long/lin?

<?php 

$input = <<<EOF 
http://www.example.com/ 
http://example.com 
www.example.com 
http://iamanextremely.com/long/link/so/I/will/be/trimmed/down/a/bit/so/i/dont/mess/up/text/wrapping.html 
EOF; 

$output = preg_replace("/(http:\/\/|(www\.))(([^\s<]{4,27})[^(\s|,)<]*)/", 
'<a href="http://$2$3" rel="nofollow">http://$2$4</a>', $input); 
+1

duplication possible de [Tronquer une chaîne multi-octets à n caractères] (http://stackoverflow.com/questions/2154220/truncate-a-multibyte-string-to-n-chars) – Gordon

+3

Conseil pro: Ne jamais commencer une question avec "devrait être assez simple", car il ne l'est pas souvent. –

+0

@Andy, j'ai pensé cette chose même moi-même. –

Répondre

1

Vous pouvez utiliser preg_replace_callback pour appliquer un rappel à tous les urls correspondants. Dans le rappel, vous pouvez faire des choses aussi fantaisistes que vous le souhaitez.

$output = preg_replace_callback('#(http://|www\\.)[^\\s<]+[^\\s<,.]#i', 
           'trimlong',$input); 

function trimlong($match) 
{ 
    $url = $match[0]; 
    $disp = $url; 
    if (strlen($disp) > 24) $disp = substr($disp,0,24)."..."; 
    return "<a href=\"$url\">$disp</a>"; 
} 

(ps. Je viens de prendre votre regexp pour commencer, je ne pense pas correspondant à une url devrait être que lourd.)

+0

Cela semble prendre n'importe quel mot après le lien et en plaçant cela dans le lien. Des idées sur la façon de changer cela? –

+0

Oui, corrigez cette expression rationnelle. Je ne sais pas ce que vous essayez de faire, mais le simple fait de faire correspondre http: // 'et ensuite tous les chars (espaces blancs ou ouvertures de tags) fonctionnera bien, je suppose. Vous pouvez également faire correspondre le dernier caractère à '[,.]' Dans le cas où les URL sont intégrées dans du texte naturel. – mvds

+0

@mvds Je suis un regex noob. Pourriez-vous mettre à jour votre réponse avec la regex appropriée (c'est-à-dire exactement ce que vous avez dit fonctionnerait de manière géniale). Si oui, j'aimerais accepter votre réponse. –

1

À moins que vous devez correspondre à un format spécifique, à savoir que le http: // liens, une expression régulière est surpuissant. Utilisez simplement les fonctions de chaîne et faites une boucle sur vos URLs pour tester leur longueur. Si vous voulez obtenir la fantaisie, utilisez explode() et array_walk()

if (strlen($url) > 27) { 
    echo substr($url, 0, 27) . '...'; 
} 
else { 
    echo $url; 
} 
+0

Je suis en train d'analyser de longs blocs de texte qui provenaient à l'origine de l'entrée de l'utilisateur, j'ai donc besoin de regex. –

+3

Définir * analyse *. Je ne suis pas convaincu du * besoin * d'utiliser une regex. –

+1

@Jason McCreary Je suppose que Josh signifie que les URL en question sont dans un corps plus large de texte comme un commentaire ou un post de forum, et ils ne sont pas des chaînes isolées dans un tableau. – cbednarski

0

Si cela est pour l'affichage dans une page HTML, vous pouvez envisager en utilisant CSS pour le styliser avec une ellipse plutôt que de le tronquer manuellement.

Vous utiliserez des CSS comme ceci:

.cutshort { 
    overflow: hidden; 
    -o-text-overflow: ellipsis; 
    text-overflow: ellipsis; 
    white-space: nowrap; 
    width:100%; 
} 

Le texte serait alors tronqué à l'écran et donner des points de suspension, même si le code HTML contenait la chaîne complète.

Cette technique n'est pas adaptée à tous les cas, mais là où elle fonctionne, c'est une excellente alternative au piratage de votre contenu avant de l'envoyer à l'utilisateur.

Une remarque importante: La version actuelle du navigateur Firefox n'affiche pas les points d'ellipse. Il est quand même tronqué correctement, donc ce n'est pas un désastre. Tous les autres navigateurs montrent les points, et une nouvelle version de Firefox devrait bientôt l'ajouter.

Questions connexes