Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Отбьютифаить код


Автор: champion 25.10.2011, 08:55
Такой код
Код

$referer = addslashes($_SERVER["HTTP_REFERER"]);  
if ( substr($referer, 0, 7) !== "http://" ) {
        $referer = "http://" . $referer;
}
$referer = parse_url($referer);
$referer = $referer["host"];

Можно ли как-то переписать его красивее?

Автор: ksnk 25.10.2011, 09:35
Если от реферера требуется только хост, то не имеет большого смысла делать ему addslashes.
Вероятно, проще будет выковырять хост с помощью регулярки, так как кроме http бывают еще и https.
Код

~(?:https?://|)([^/]+)*.?~i

примерно такой...


Автор: patap 25.10.2011, 09:41
вот еще интересная функция http://php.net/manual/ru/function.parse-url.php есть, тоже может быть уместной

Автор: champion 25.10.2011, 10:15
Цитата(ksnk @  25.10.2011,  09:35 Найти цитируемый пост)
Если от реферера требуется только хост, то не имеет большого смысла делать ему addslashes.

реферер заносится в БД, на всякий случай фильтрую

Да, у самого была мысль сделать регулярку, практически такая же
 
Код

/^(?:https?\:\/\/)?([^\/]+).*/


По скорости (parse_url и preg_replace) работают по разному, сейчас как раз выяснил, что parse_url не много, но быстрее регулярки
P>S> перед : слеш разве не ставится?

Автор: ksnk 25.10.2011, 10:41
Цитата(champion @  25.10.2011,  10:15 Найти цитируемый пост)
 перед : слеш разве не ставится?

В этом случае работает и так, хотя preg_quote ':' слешит.
Цитата(champion @  25.10.2011,  10:15 Найти цитируемый пост)
parse_url не много, но быстрее регулярки

Не удивительно. Однако parse_url не корректно работает с адресами без http:// , так что в процедуру вычисления скорости нужно включить еще механизм "дописывания" протокола к неполному урлу  smile 

Автор: champion 25.10.2011, 11:46
Так и сделал.

Тем не менее быстрее чем preg_replace. 

Автор: Absinthe 25.10.2011, 13:42
Цитата

Однако parse_url не корректно работает с адресами без http:// 
 Где это?

Код

var_dump(parse_url("/1/2?p=3#4"));


Цитата

array
  'path' => string '/1/2' (length=4)
  'query' => string 'p=3' (length=3)
  'fragment' => string '4' (length=1)


Все нормально.

Автор: bars80080 25.10.2011, 13:54
Цитата(Absinthe @  25.10.2011,  13:42 Найти цитируемый пост)
Все нормально. 

а хост где?

Код

$s = parse_url("site.com/1/2?p=3#4");
dump($s);



Код

Array[3]
   path => "site.com/1/2"
   query => "p=3"
   fragment => "4"


Код

$s = parse_url("http://site.com/1/2?p=3#4");
dump($s);


Код

Array[5]
   scheme => "http"
   host => "site.com"
   path => "/1/2"
   query => "p=3"
   fragment => "4"

Автор: Absinthe 25.10.2011, 17:27
bars80080, ну все правильно же, разве нет?

site.com/1/2?p=3#4 - это то же самое, что и current-scheme://current-host/site.com/1/2?p=3#4

Автор: ksnk 25.10.2011, 18:23
Absinthe, parse_url работает ПРАВИЛЬНО с точки зрения структуры url, но не КОРРЕКТНО с точки зрения решаемой задачи.
Простой юзер, когда видит в тексте строчку site.com/1/2 искренне верит, что она ведет на site.com, а совсем даже не на current-host. А юзеров обманывать нельзя   smile

Автор: bars80080 25.10.2011, 18:52
именно, с точки зрения чоловека не правильно. потому и приходится делать ручной (чоловеческий) разбор.

Автор: Absinthe 25.10.2011, 18:55
Цитата

но не КОРРЕКТНО с точки зрения решаемой задачи.
 Ну так в решаемой задаче и нет URL. Я просто заступился за функцию, которая парсит URL.

Цитата

именно, с точки зрения чоловека не правильно. потому и приходится делать ручной (чоловеческий) разбор.
 С точки зрения человека функция на 100% права, если что. Просто ты не понимаешь разницы между "адресом сайта при каком-то разборе пользовательских данных" и URL.

Автор: ksnk 25.10.2011, 19:12
Цитата(Absinthe @  25.10.2011,  18:55 Найти цитируемый пост)
 С точки зрения человека функция на 100% права, если что. Просто ты не понимаешь разницы между "адресом сайта при каком-то разборе пользовательских данных" и URL.

Возможно, окажется полезно посмотреть таки на задачу, решаемую топикстартером, и потом уже делать выводы? 

Автор: bars80080 25.10.2011, 19:14
Цитата(Absinthe @  25.10.2011,  18:55 Найти цитируемый пост)
С точки зрения человека функция на 100% права, если что. Просто ты не понимаешь разницы между "адресом сайта при каком-то разборе пользовательских данных" и URL. 

ай-яй-яй, зачем же вот так просто и переход на личности. быть злым - очень плохо, можно невзначай умереть. и здесь я совершенно не шучу, видел одного человека, которого съела злоба через неопределённое врачами заболевание.
даже если показалось что-то плохое в словах собеседника - надо стараться выглядывать хорошее

а вот там я немного пошутил, указывая, что под специфическую задачу приходится собирать своё решение. причём специфика задачи происходит от самого человека. не желал бы - и обошёлся бы стандартными средствами

и я знаю, что есть URL

Автор: Absinthe 25.10.2011, 19:27
Цитата

Возможно, окажется полезно посмотреть таки на задачу, решаемую топикстартером, и потом уже делать выводы? 
 Так ведь я не топикстартеру отвечал, а тебе. Я сказал лишь, что с АДРЕСАМИ(URL) они работают правильно.

Цитата

и я знаю, что есть URL
 Ну тогда и с точки зрения человека оно правильно работает с URL, не так ли?

Автор: ksnk 25.10.2011, 20:01
Цитата(Absinthe @  25.10.2011,  19:27 Найти цитируемый пост)
 Так ведь я не топикстартеру отвечал, а тебе. Я сказал лишь, что с АДРЕСАМИ(URL) они работают правильно.

Цитата(ksnk @  25.10.2011,  18:23 Найти цитируемый пост)
Absinthe, parse_url работает ПРАВИЛЬНО с точки зрения структуры url, но не КОРРЕКТНО с точки зрения решаемой задачи.

А я сказал что-то другое?

Автор: bars80080 25.10.2011, 22:21
Цитата(Absinthe @  25.10.2011,  19:27 Найти цитируемый пост)
Ну тогда и с точки зрения человека оно правильно работает с URL, не так ли? 

с человеческой - да, а вот с точки зрения чоловека (в смысле, мужика), нет


Цитата(bars80080 @  25.10.2011,  18:52 Найти цитируемый пост)
именно, с точки зрения чоловека не правильно. потому и приходится делать ручной (чоловеческий) разбор.


или вы подумали, что я такой неграмотный, что ошибки в простейших словах делаю?

Автор: MoLeX 26.10.2011, 06:01
Модератор: Давайте вернёмся к теме обсуждения.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)