ссылки - "родственники"

scandal

Новичок
ссылки - "родственники"

Здравствуйте!
$curURL - абсолютная ссылка.
$newURL - может быть как абсолютной, так и относительной ссылкой.
Вот написал функцию NativeLink, которая ПО ИДЕЕ должна сравнивать ссылки $curURL и $newURL и выдавать $newURL, если эти ссылки на страницы из одного сайта.
Если $curURL и $newURL указывают на ссылки из разных сайтов, то должна возвращаться пустая строка.
Если $newURL относительная ссылка, то должна быть сформирована абсолютная ссылка.
Вроде функция работает. Но очень хотелось бы, сделать код более оптимальным и устранить недостатки, учесть недочеты.

PHP:
function NativeLink($curURL, $newURL)
{
	preg_match("/^(http:\/\/)?([^\/]+)/i", $curURL, $matches);// get domain name from URL
	$maindomain = $matches[2];
	preg_match("/^(http:\/\/)?([^\/]+)/i", $newURL, $matches);// get domain name from URL
	if(isset($matches[2])) {
		$domain = $matches[2];
		preg_match("/[^\.\/]+\.[^\.\/]+$/", $domain, $matches);// get last two segments of host name
		if(isset($matches[0])) {
			$w1=0; $w2=0;
			//так как [url]www.site.ru[/url] эквавалентна site.ru, приводим к одинаковому виду ссылки, затем сравниваем
			if(substr($maindomain,0,4)=="www.") $w1=1;
			if(substr($domain,0,4)=="www.") $w2=1;
			if($w1==1 && $w2==0) $domain="www.".$domain;
			if($w1==0 && $w2==1) $domain=substr($domain,4,strlen($domain)-4);
			if($maindomain==$domain) return $newURL;
			else return "";			
		}
		else if(substr($newURL,0,3)=="../") { //ссылка на одном уровне выше
			$k=strrpos($curURL,"/");
			$s=substr($curURL,0,$k-1);
			if(($k=strrpos($s,"/"))===false) return "";
			else {
				$s=substr($s,0,$k).substr($newURL,3,strlen($newURL)-3);
				return $s;
			}
		}
		else if(substr($newURL,0,2)=="./") { //ссылка с корневого каталога
			$s="http://".$maindomain.substr($newURL,1,strlen($newURL)-1);
			return $s;
		}
	}
	else if(substr($newURL,0,1)=="/") { //ссылка с корневого каталога
		$s="http://".$maindomain.$newURL;
		return $s;
	}
	else return "";
}
Заранее благодарен![/code]
 

Cron

Новичок
Юзайте parse_url и будет Вам счастье. Ну и еще я бы просто выкидвал ненужные части через str_replace. Скрипт на 5 строк, если я все правильно понял.
 

scandal

Новичок
Автор оригинала: Cron
Обязательно сделаю версию с parse_url и выставлю здесь. Правда, сейчас занят, но к понедельнику будет!
Говорите 5 строк?!
Может тоже сделаете свою версию и выставите? Только после того как я свою покажу, чтоб было интереснее. Что скажите?
 

diamond_krnl

pure-php
типа того, ага
PHP:
  public static function parse($url)
  {
    $matches = array();
    $url = strval($url);
    $ret = array("scheme" => null, "user" => null, "pass" => null, "host" => null, "port" => null, "path" => null, "query" => null, "fragment" => null);
    // absolute
    if (preg_match("~^([^:]+)://([^/?#]+)([^?#]*)(\\?([^#]*))?(#(.*))?\$~", $url, $matches) && is_array($matches))
    {
      $ret["scheme"] = (array_key_exists(1, $matches) ? $matches[1] : "");
      $ret["path"] = (array_key_exists(3, $matches) ? $matches[3] : "");
      $ret["query"] = (array_key_exists(5, $matches) ? $matches[5] : "");
      $ret["fragment"] = (array_key_exists(7, $matches) ? $matches[7] : "");
      $location = (array_key_exists(2, $matches) ? $matches[2] : "");
      $matches = array();
      preg_match("~^(([^:@]*)(:([^@]*))?@)?([^:]+)(:(.*))?\$~", $location, $matches);
      $ret["user"] = (array_key_exists(2, $matches) ? $matches[2] : "");
      $ret["pass"] = (array_key_exists(4, $matches) ? $matches[4] : "");
      $ret["host"] = (array_key_exists(5, $matches) ? $matches[5] : "");
      $ret["port"] = (array_key_exists(7, $matches) ? $matches[7] : "");
      return $ret;
    }
    // relative
    if (preg_match("~^([^?#]*)(\\?([^#]*))?(#(.*))?\$~", $url, $matches) && is_array($matches))
    {
      $ret["path"] = (array_key_exists(1, $matches) ? $matches[1] : "");
      $ret["query"] = (array_key_exists(3, $matches) ? $matches[3] : "");
      $ret["fragment"] = (array_key_exists(5, $matches) ? $matches[5] : "");
      return $ret;
    }
    return $ret;
  }
 

scandal

Новичок
Я неправильно выразился. Я хотел сказать, что сделаю новую версию своей функции NativeLink, но с использованием стандартного parse_url.
Люди, что есть какие-то недостатки у стандартного parse_url?
 

Groove

Новичок
вот он и баг проявился, смайлик пропарсился в бб-коде
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
scandal
стандартный parse_url работает хорошо, но многие начинают с изобретения велосипедов: большинство пишет свою cms, а кто-то - parse_url
 
Сверху