短網址生成思路算法


生成短網址的思路:如果把短網址還原了,你知道是個什么樣子的嗎?比如:

http://www.phpernote.com/javascript-function/834.html

對於以上這個鏈接,除了直接打開之外,還有一種方法打開它,如下:

http://www.phpernote.com/link.php?url=http://www.phpernote.com/javascript-function/834.html

好了,短網址還原了實際就是這個樣子的了,可能你看到新浪微博應用里面的短網址都是這個樣子:

http://t.cn/zHEYrvV

其實他還原了說不定就是這個樣子:

http://t.cn/link.php?url=http://www.phpernote.com/php-template-framework/832.html

好了,這里就說到第二步了,如何將

http://t.cn/link.php?url=http://www.phpernote.com/php-template-framework/832.html

縮成

http://t.cn/zHEYrvV

這個地方需要用到url重寫,按照本例則可以這么重寫:

RewriteEngine On
RewriteBase /
RewriteRule ^/(.*)$ link.php?url=$1[L]

這里就實現了將 http://t.cn/link.php?url=zHEYrvV 轉換為了 http://t.cn/zHEYrvV ,縮短了不少,那么如何通過 zHEYrvV 去查找到 http://www.phpernote.com/php-template-framework/832.html 這個網址並跳到這個網址上去呢?這里就用到了一個類似加密的算法了,通過算法將所有的長網址縮短成一個對應的5-6位的並且唯一字符串,並將這個對應關系存入到數據庫中去。結合本例就是根據傳入的參數 zHEYrvV 到數據庫中去找對應的網址,找到了就 header 跳轉過去。

ok,至於生成短網址的思路就是這個樣子的了。

下面分享一下通過php生成短網址的那個過程(這里將長網址生成短至5-6位字符長度並且還需要是唯一的):

 

<?php
function code62($x){
    $show='';
    while($x>0){
        $s=$x % 62;
        if ($s>35){
            $s=chr($s+61);
        }elseif($s>9&&$s<=35){
            $s=chr($s+55);
        }
        $show.=$s;
        $x=floor($x/62);
    }
    return $show;
}
function shorturl($url){
    $url=crc32($url);
    $result=sprintf("%u",$url);
    return code62($result);
}

 

 

crc32() 函數計算一個字符串的 crc32 多項式。

 

該函數可用於驗證數據的完整性。提示:由於 PHP 的整數是帶符號的,許多 crc32 校驗碼將返回負整數,因此您需要使用 sprintf() 或 printf() 的 "%u" 格式符來獲取表示無符號 crc32 校驗碼的字符串

 

比如

echo shorturl('http://www.phpernote.com/');

將生成的一個唯一對應碼為 n2Q8e ,OK,至於如何去做 url重寫和數據庫存儲這里就不多寫了,自己根據自己的情況來吧。

轉自:http://www.phpernote.com/php-function/845.html

完整過程:

 

建立數據庫

 

進入phpmyadmin創建一個名為 shorturl 的數據庫,添加一個名為test的表,添加3個字段,分別為 id、turl、surl

 

  • id設置為int(10) 額外設置成auto_increment
  • url設置為text 其他默認
  • surl設置為varchar(10) 並把屬性設置成唯一,避免重復輸入

shorturl.php:

<?php
$conn=mysqli_connect('localhost','root','sm159357','shorturl') or die("connect error");

 
$content ='
this is a test content
the url 1 is http://www.sjyhome.com/13579.html
the url 2 is http://www.sjyhome.com/24680.html
the url 3 is http://www.sjyhome.com/12698.html
';

preg_match_all('/http\:\/\/www.sjyhome.com\/\d+\.html/',
$content,$mat);
 print_r($mat[0]);
for($i=0;$i<count($mat[0]);$i++)
{
    $turl=$mat[0][$i];//匹配到的網址ַ
    $surl=shorturl($turl);//縮短匹配到的網址ַ
    $content=str_replace($turl,'http://localhost/php/shorturl/go.php?'.$surl,$content); 
$sql="INSERT INTO shorturl (id,url,surl)values('','$turl','$surl')"; 
 
mysqli_query($conn,$sql) or die("errror");
}
echo "hello";

 

現在訪問shorturl.php這個文件,就會在數據庫中插入3條匹配到的記錄以及對應的短網址。

由於在數據庫中字段surl設置成了唯一性,所以即使不斷的刷新shorturl.php這個文件也不會再增加數據。如果不設置surl唯一性,每刷新一次都會添加一次數據,所以切記一定要把字段surl設置成唯一性屬性。

在變量$content中再增加幾個符合規則的網址,只要刷新一次,就會自動新增到數據庫,絕對不會重復。

創建跳轉文件;

<?php
$conn=mysqli_connect('localhost','root','sm159357','shorturl') or die("connect error");

$cs=$_SERVER['QUERY_STRING'];
$sql="SELECT url FROM shorturl WHERE surl='$cs' limit 1";
$result=mysqli_query($conn,$sql) or die("error");

$data=mysqli_fetch_assoc($result) or die("mysqli_fetch error");
if($data['url']!="")
{
        $urlto=$data['url'];
        header("Location:".$urlto,TRUE,301);
}
else
{
    header("Location:./");
}

OK,現在當用戶點擊你的短網址到go.php這個頁面時就會判斷,如果存在這個短網址就跳轉到對應的原網址,如果不存在,就跳轉到首頁。

參考了:http://www.sjyhome.com/php/shorturl.html

 

新浪短網址使用:

http://www.biaodianfu.com/sina-shortener-url-api-php.html

 

更多:http://www.cnblogs.com/lsl8966/p/3315204.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM