生成短網址的思路:如果把短網址還原了,你知道是個什么樣子的嗎?比如:
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