2010-10-19 6 views
4

J'ai besoin d'aide en PHP pour créer de courtes URL comme StackOverflow crée quand nous commenterons une longue URL dans les commentaires sur une question.Raccourcissez le texte d'URL sur des liens comme stackoverflow?

StackOverflow raccourcit http://www.noupe.com/how-tos/10-ways-to-automatically-manually-backup-mysql-database.html longue URL pour urls courtes comme celui-ci noupe.com/...

Je requiers le même genre de fonctionnalités dans mon application. Quelqu'un peut-il donner une idée ou un code pour le faire en PHP? J'ai fatigué de chercher sur StackOverflow mais je n'ai trouvé aucune question. Je me souviens que j'avais vu ce type de question sur le SO, mais maintenant je ne suis pas capable de le trouver :(

S'il vous plaît aider!

Répondre

7

Juste un aperçu d'un algorithme simpliste.

  1. Voir si le lien contient plus de X caractères.
  2. Supprimez le http:// ou https:// au début avec str_replace.
  3. Exploser à / et conserver uniquement le premier élément du tableau renvoyé.
  4. Si vous avez trouvé plus d'un article à l'étape 3, ajoutez /... à la fin.
  5. Facultatif. Supprimer le www. au début avec str_replace.

Avec cette chaîne trouvée, nommant [shortURL], vous rédigez votre point d'ancrage:

<a href="[fullURL]">[shortURL]</a> 
+0

Bien que cela soit vrai, vous ne parvenez pas à répondre au fait que l'URI doit également être trouvé dans l'entrée de l'utilisateur. –

+0

Je ne pense pas que la source des URL soit pertinente à la question. –

-3

Pour créer des URL « personnalisée » qui ne dispose pas d'un fichier correspondant, vous « ll faut configurer votre serveur Web Si vous utilisez Apache et ont le droit de le faire, vous pouvez jeter un oeil à mod_rewrite. http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html

et un tutoriel: http://articles.sitepoint.com/article/guide-url-rewriting

+8

Vous êtes hors sujet :). –

+2

Avez-vous déjà essayé de lire un corps de question? –

+0

La raison pour laquelle votre réponse n'est pas correcte est que le texte affiché dans une balise d'ancrage n'a pas à correspondre à l'URI pointé par l'attribut href de la balise d'ancrage. Cela dit, vous avez raison de dire que presque tous les autres URI sur stackoverflow.com sont certainement créés en utilisant des techniques de réécriture d'URL telles que celles décrites dans les liens que vous avez publiés. –

2

Je dirais que il suffit de chercher <a> dans yo sortie de votre source, et changer sa valeur en conséquence. href reste le même, mais vous changez le nom du lien à ce que vous voulez.

Mais c'est juste une idée ... Vous pouvez toujours expérimenter de nouvelles choses.

Il devrait aussi y avoir un moyen d'accomplir ceci avec javascript on-the-go.

Pensez à sortir de la boîte!

1

est ici fonction de remplacer les URL avec des liens. Vous aurez juste besoin d'ajuster la façon dont vous voulez le formater.Peut-être utiliser parse_url()

<?php 
function URLref($sentence){ 
    $temp = explode(" ", $sentence); 
    $new = ""; 
    foreach($temp as $i){ 
    if(preg_match('([A-Za-z][A-Za-z0-9+.-]{1,120}:[A-Za-z0-9/](([A-Za-z0-9$_.+!*,;/?:@&~=-])|%[A-Fa-f0-9]{2}){1,333}(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*,;/?:@&~=%-]{0,1000}))?)', $i)){ 
     $new .= '<a href="'.$i.'">'.$i.'</a>'; 
    }else{ 
     $new .= "$i "; 
    } 
    } 
    return trim($new); 
} 
$sentence = "My site ULR is http://www.google.com/lolz.html"; 

echo URLref($sentence); 
+0

Salut j'ai aimé votre réponse, Et si nous voulons raccourcir l'URL comme le PO a dit. Que se passe-t-il si, lorsque vous écrivez $ phrase, cela donnera ** 'Mon site ULR est http://www.google.com/...'**? comment faire ça ? –

+0

cher @petah je suppose que je l'ai réparé, j'ai une question, comment si l'URL n'a pas http? il n'a que ** 'www.google.com' ** comment pourriez-vous modifier votre regex pour trouver aussi ces URL sans http: //, merci –

1

Vous pouvez récupérer les URL en utilisant des expressions régulières, ici deux exemples sur la façon de créer <a> balises des URL trouvées et sur la façon de réduire le contenu des <a> tags:

<?php 

$orig_text = <<<TEXT 
This is some text. http://www.example.com/this-is-a-quite-long-url-to-be-shortened.html 
http://www.example.com/another-url-to-be-shortened and http://www.example.com/another-one-that-is-longer-than-limit then 
http://www.example.com/an-ok-url and some text to finish the sentence. 

Now, try with an HTTPS url: https://www.example.com/this-https-url-is-too-long. 

And with an already-created tag <a href='http://www2.example.com/this-is-another-long-url.html'>http://www2.example.com/this-is-another-long-url.html</a> <a href='http://www2.example.com/my-test-url-goes-here.html'>And this is just some long long link description to be shortened</a>. More text here. 

TEXT; 

$PATTERN_URL='#(?:href=[\'"]?)?!(https?://([^/]+)/([^\s]+))\b#'; 
define('URL_LENGTH_LIMIT', 36); 

function create_a_tag($matches) { 
    $url = $matches[1]; 
    $label = $matches[1]; 
    if (strlen($label) > URL_LENGTH_LIMIT) $label = $matches[2] . '/...'; 
    return "<a href='$url'>$label</a>"; 
} 

function shorten_url_or_text($url) { 
    if (strlen($url) > URL_LENGTH_LIMIT) { 
    $matches = array(); 
    if (preg_match('#^(https?://[^/]*).*#', $url, $matches)) { 
     // Shorten as for URLS 
     return $matches[1] . '/...'; 
    } 
    else { 
     // Trim to a given length 
     return substr($url, 0, URL_LENGTH_LIMIT-3) . '...'; 
    } 
    } 
    else { 
    return $url; 
    } 
} 

function shorten_a_text($matches) { 
    $text = shorten_url_or_text($matches[2]); 
    return $matches[1] . $text . $matches[3]; 
} 

// This will replace urls with their shortened form 
echo "----- CREATE <A> TAGS -----\n"; 
$text2 = preg_replace_callback($PATTERN_URL, 'create_a_tag', $orig_text); 
echo $text2 . "\n"; 

// This will shorten content inside <a> tags 
echo "----- CREATE <A> TAGS -----\n"; 
$text3 = preg_replace_callback('@(<a[^>]*>)([^<]*)(</a>)@i', 'shorten_a_text', $text2); 
echo $text3; 
echo "\n"; 
+0

On dirait que stackoverflow n'a pas deviné la bonne syntaxe highlighter .. et la chaîne heredoc n'a pas été coloré correctement. – redShadow

Questions connexes