$link->define("
str show;
int id;
");
يجب تعريف متغيرات الرابط التي تستخدمها من خلال الدالة define
وذلك لحماية المتغيرات
وتسمح الدالة define بإضافة انواع عديدة لغرض الحماية
كل متغير له اسم ونوع فالرابط التالي:
www.site.com/artical.php?show=details&id=231
$link->setURL('http://www.site.com/?id=231', CleanURL::SHORT);
$link->setType(CleanURL::LONG);
يمكن استخدام الدالة setType لتحديد شكل جميع الروابط، وتبقى الأولوية للدالة setURL لتحديد شكل الرابط.
وعند استخدام الدالة setType فلا تحتاج لتحديد شكل الرابط في الدالة setURL.
استبعاد مسار أو اسم ملف
$link->exclusionPath( 'forum/thread');
إذا كان هناك مسار لمجلد معين فيجب تحديده كمسار
لكي يتم استبعاده من عملية التحويل، فالرابط التالي:
http://mysite/forum/thread/512
$link->exclusionPath('artical.php', '.php');
يحتلف تطبيق الدالة exclusionPath على الروابط الطويلة
حيث يمكن استبعاد مسار وحذف جزء منه
فمثلاً إذا أردنا تحويل الرابط:
http://www.site.com/artical.php?show=details&id=231
www.site.com/artical/details/231
يجب استبعاد المسار artical.php
واستبعاد اللاحقة .php ايضاً
لذا نستخدم الدالة exclusionPath.
ملاحظات للتطوير
بقي التذكير بأنه في حالة رغبتك بتطوير هذا الكلاس تستطيع استخدام الدالتين _short2long و _long2short لتحويل متغيرات الرابط، حيث تقوم كل دالة بتغيير نوع الرابط للشكل المناسب ولاحاجة للتعديل عليهما، وما عدا ذلك فيمكنك تغييره حسب الحاجة.
كود الكلاس/الفئة CleanURL
<?php
/* ***********************************
* Author : <HishamDalal@gmail.com>
* Project Name : CleanURL
* Version : 1.0
* Date : 2013-11-10 13:10
* *********************************** */
class CleanURL {
const SHORT = 1;
const LONG = 2;
// $link_types Would be like this array Ex. array('page'=>1, 'cat'=>'news', 'id'=>23);
private $link_types = array();
private $type = 0;
private $full_url = null;
private $site_name = null;
private $exclusion_path = null;
private $remove_from_path = null;
//------------------------------------------------------------------//
// This function has an effect that change URL type,
//so you don't need to mention the type in second parameter when you use the function "set"
function setType($to){
$to = intval($to);
if($to == CleanURL::SHORT || $to == CleanURL::LONG){
$this->type = $to;
}
}
//------------------------------------------------------------------//
// Used to define URL parameter types
function define($strCode){
preg_match_all("/([\w]+)[\s]+([\w]+);/s", $strCode, $m);
if(isset($m[1]) && isset($m[2])){
$this->link_types = array_combine($m[2], $m[1]);
}
}
//------------------------------------------------------------------//
// Make a decision
private function _set($link, $type=0) {
if($type==CleanURL::LONG){
return $this->_short2long($link);
}elseif($type==CleanURL::SHORT){
return $this->_long2short($link);
}elseif($this->type==CleanURL::LONG){
return $this->_short2long($link);
}elseif($this->type==CleanURL::SHORT){
return $this->_long2short($link);
}
return $link;
}
//------------------------------------------------------------------//
private function _short2long($link) {
//Find wrong sign
if(strpos($link, '&')){ return $link; }
$link = trim($link, '/');
$ary = explode('/', $link);
if(is_array($ary) && count($ary)>1){
$i=0;
$link = '?';
foreach($this->link_types as $key=>$type){
$myKey = @$ary[$i];
if(isset($myKey)){
$value = $this->_applayVarType($myKey, $type);
$link .= $key.'='.$value.'&';
}
$i++;
}
$link = rtrim($link, '&');
}
return $link;
}
//------------------------------------------------------------------//
private function _long2short($link1) {
$link1 = trim($link1, '?');
$ary = explode('&', $link1);
$link = '';
if(is_array($ary) && count($ary)>1){
foreach($ary as $var) {
$varData = explode('=', $var);
if(count($varData)>1){
$key = $varData[0];
$value = $varData[1];
if(isset($this->link_types[$key])){
$value = $this->_applayVarType($value, $this->link_types[$key]);
$link .= $value.'/';
}
}else{
return $link1;
}
}
return rtrim($link, '/');
}
return $link1;
}
//------------------------------------------------------------------//
// Secure variable type.
private function _applayVarType($value, $type) {
switch($type) {
// You can add any security function you want.
case 'int': $value = intval($value); break;
case 'chr': $value = strlen($value)==1 ? $value : $value[0]; break;
}
return $value;
}
//------------------------------------------------------------------//
function exclusionPath($path, $remove=null){
$this->exclusion_path = $path;//str_replace($remove, '', $path);
$this->remove_from_path = $remove;
}
//------------------------------------------------------------------//
//------------------------------------------------------------------//
// Main function for end-user, It's used to convert URL format
function setURL($url, $type=0, $force=null){
$parse = parse_url($url);
if( isset($parse['host']) || $force){
$scheme = isset($parse['scheme']) ? $parse['scheme'].'//' : '';
$host = isset($parse['host']) ? $parse['host'] : '';
$path = isset($parse['path']) ? $parse['path'] : '';
$query = isset($parse['query']) ? $parse['query'] : '';
if(@$parse['host']==$_SERVER['HTTP_HOST'] || $force){
if( $query ){
// long to short
$path = str_replace($this->exclusion_path, '', $path);
$url = $scheme.$host.$path
. str_replace($this->remove_from_path, '/', $this->exclusion_path)
. $this->_set($query, $type);
}elseif( $path ){
// short to long
$path = str_replace($this->exclusion_path, '', $path);
$url = $scheme.$host.'/'
.$this->exclusion_path
.$this->_set($path, $type);
}
$this->exclusion_path = null;
$this->remove_from_path = null;
}
}else{
trigger_error("Wrong URL Format!");
}
return $url;
}
//------------------------------------------------------------------//
}
?>
<?php
$link = new CleanURL();
// Define parameters types
$link->define("
int page;
str cat;
str sub;
int id;
chr k;
");
$url = 'http://localhost/1z/news/details/12/y';
echo '<hr><b>Convert short to long:</b>';
echo '<br /><b>Source:</b> '. $url .'<br /><b>Result:</b> ';
echo $link->setURL($url, CleanURL::LONG);
//------------------------------------------------------------------------
$url = 'http://localhost/?page=1&cat=news&sub=details&id=12code&k=false';
echo '<hr><b>Convert long to short:</b>';
echo '<br /><b>Source:</b> '. $url .'<br /><b>Result:</b> ';
echo $link->setURL($url, CleanURL::SHORT, true);
//------------------------------------------------------------------------
$link->exclusionPath( 'forum/index.php');
$url = 'http://localhost/forum/index.php/1z/news/details/12/y';
echo '<hr><b>Convert short to long</b> [Use function "exclusionPath()"]: ';
echo '<br /><b>Source:</b> '. $url .'<br /><b>Result:</b> ';
echo $link->setURL($url, CleanURL::LONG);
//------------------------------------------------------------------------
$link->exclusionPath( 'index.php' , '.php');
$url = 'http://localhost/forum/index.php?page=1&cat=news&sub=details&id=12code&k=false';
echo '<hr><b>Convert long to short:</b> [Use function "exclusionPath()"]: ';
echo '<br /><b>Source</b>: '. $url .'<br /><b>Result:</b> ';
echo $link->setURL($url, CleanURL::SHORT);
//------------------------------------------------------------------------
$url = 'http://localhost/1/news/details/12/y';
echo '<hr><b>Convert short to long</b> [Use function "setType()"]: ';
echo '<br /><b>Source:</b> '. $url .'<br /><b>Result:</b> ';
$link->setType(CleanURL::LONG);
echo $link->setURL($url);
//------------------------------------------------------------------------
$url = 'http://othersite.com/any-query';
echo '<hr><b>Convert other site url</b> (Doesn\'t convert): ';
echo '<br /><b>Source</b>: '. $url .'<br /><b>Result:</b> ';
echo $link->setURL($url, CleanURL::LONG);
$url = 'http://othersite.com/forum/?page=1&cat=news&sub=details&id=12code&k=false';
echo '<hr><b>Convert other site url:</b> [Use "force" to convert]: ';
echo '<br /><b>Source</b>: '. $url .'<br /><b>Result:</b> ';
echo $link->setURL($url, CleanURL::SHORT, true);
?>
في حالة وجود خطأ يرجى المشاركة وإيضاح الخطأ ليتم تلافيه، يسعدني قيامكم بتعديل اخطاء الكلاس..