开发者

Shorten URL text on links like stackoverflow?

I need some help in PHP to create short urls just like StackOverflow creates when we comment any long URL in comments on a question.

StackOverflow shortens http://www.noupe.com/how-tos/10-ways-to-automatically-manually-backup-mysql-database.html long url to short urls like this noupe.com/...

I require similar kind of functionality in my application. Can anyone give some idea or code how to do that in PHP?

I tired searchi开发者_高级运维ng it on StackOverflow but not found any question. I remember I had seen such type of question on SO, but right now I am not able to find it :(

Please help!


Just an outline of a simplistic algorithm.

  1. See if the link has more than X chars in length.
  2. Remove the http:// or https:// at the beginning with str_replace.
  3. Explode at / and only keep the first item in the returned array.
  4. If you found more than 1 item at step 3 add /... at the end.
  5. Optional. Remove the www. at the begining with str_replace.

With this found string, naming it [shortURL], you compose your anchor:

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


My guess would be that you just have to search for <a> tags in your source output, and change it's value accordingly. href stays the same, but you change the link name to what you want.

But that's just one idea... You can always experiment with new stuff.

There should also be a way to accomplish this with javascript on-the-go.

Think out of the box!


Here is a function to replace URLs with links. You will just need to adjust how you want to format it. Maybe use 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);


You could retrieve URLs using regular expressions, here two examples on how to create <a> tags from found URLs and on how to shorten content of <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";


To create "custom" URL's that do not have a matching file, you'll have to configure your webserver. If you're using Apache and have the rights to do so, you can take a look at mod_rewrite: http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html

And a tutorial: http://articles.sitepoint.com/article/guide-url-rewriting

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜