缩短stackoverflow等链接上的URL文本?

时间:2010-10-19 08:23:06

标签: php url short

我需要PHP中的一些帮助来创建简短的URL,就像StackOverflow在我们在一个问题的评论中评论任何长URL时创建的那样。

StackOverflow将http://www.noupe.com/how-tos/10-ways-to-automatically-manually-backup-mysql-database.html个长网址缩短为这样的短网址noupe.com/...

我的应用程序中需要类似的功能。任何人都可以在PHP中提供一些想法或代码如何做到这一点?

我厌倦了在StackOverflow上搜索但没有发现任何问题。我记得我在SO上看过这样的问题,但现在我无法找到它:(

请帮忙!

5 个答案:

答案 0 :(得分:7)

简单算法的概述。

  1. 查看链接的长度是否超过X个字符。
  2. 使用http://删除开头的https://str_replace
  3. /处爆炸,只保留返回数组中的第一项。
  4. 如果您在步骤3中找到了多个项目,请在最后添加/...
  5. 可选。在www.开头删除str_replace
  6. 使用此找到的字符串,将其命名为[shortURL],您可以构建锚点:

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

答案 1 :(得分:2)

我的猜测是你只需在源输出中搜索<a>标签,并相应地更改它的值。 href保持不变,但您将链接名称更改为您想要的名称。

但这只是一个想法......你总是可以尝试新的东西。

还应该有一种方法可以使用javascript随时随地完成此操作。

开箱即用!

答案 2 :(得分:1)

这是一个用链接替换URL的功能。您只需要调整格式化方式即可。也许使用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);

答案 3 :(得分:1)

您可以使用正则表达式检索网址,此处有两个示例,说明如何根据找到的网址创建<a>代码以及如何缩短<a>代码的内容:

<?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";

答案 4 :(得分:-3)

要创建没有匹配文件的“自定义”网址,您必须配置您的网络服务器。如果您正在使用Apache并且有权这样做,那么您可以查看mod_rewritehttp://httpd.apache.org/docs/1.3/mod/mod_rewrite.html

教程: http://articles.sitepoint.com/article/guide-url-rewriting