Я пытаюсь создать php-функцию, которая проверяет, является ли URL-адрес прохода коротким URL-адресом. Что-то вроде этого:
/** * Check if a URL is a short URL * * @param string $url * return bool */ function _is_short_url($url){ // Code goes here }
Я знаю, что более простой и надежный способ – проверить перенаправление 301, но эта функция направлена на сохранение внешнего запроса только для проверки. Также функция не должна проверять список URL-адресов, поскольку это будет менее масштабируемый подход.
Вот несколько возможных проверок, о которых я думал:
Любые мысли о возможном подходе или более исчерпывающий контрольный список для этого?
EDIT: эта функция является попыткой сохранить внешний запрос, поэтому его ok возвращает true для короткого URL-адреса (но очень короткий). Сообщение, проходящее через эту функцию, я все равно разворачиваю все короткие URL-адреса, проверяя 301 переадресацию. Это просто для устранения очевидных.
Я бы не рекомендовал использовать регулярное выражение, поскольку он будет слишком сложным и трудным для понимания. Вот PHP-код для проверки всех ваших ограничений:
function _is_short_url($url){ // 1. Overall URL length - May be a max of 30 charecters if (strlen($url) > 30) return false; $parts = parse_url($url); // No query string & no fragment if ($parts["query"] || $parts["fragment"]) return false; $path = $parts["path"]; $pathParts = explode("/", $path); // 3. Number of '/' after protocol (http://) - Max 2 if (count($pathParts) > 2) return false; // 2. URL length after last '/' - May be a max of 10 characters $lastPath = array_pop($pathParts); if (strlen($lastPath) > 10) return false; // 4. Max length of host if (strlen($parts["host"]) > 10) return false; return true; }
Вот небольшая функция, которая проверяет все ваши требования. Я смог проверить его, не используя сложное регулярное выражение, … только preg_split. Вы должны легко адаптировать его.
<?php var_dump(_isShortUrl('http://bit.ly/foo')); function _isShortUrl($url) { // Check for max URL length (30) if (strlen($url) > 30) { return false; } // Check, if there are more than two URL parts/slashes (5 splitted values) $parts = preg_split('/\//', $url); if (count($parts) > 5) { return false; } // Check for max host length (10) $host = $parts[2]; if (strlen($host) > 10) { return false; } // Check for max length of last URL part (after last slash) $lastPart = array_pop($parts); if (strlen($lastPart) > 10) { return false; } return true; }
Если бы я был вами, я бы проверил, показывает ли URL-адрес 301 переадресацию, а затем проверяет, перенаправляет ли перенаправление на другой веб-сайт:
function _is_short_url($url) { $options['http']['method'] = 'HEAD'; stream_context_set_default($options); # don't fetch the full page $headers = get_headers($url,1); if ( isset($headers[0]) ) { if (strpos($headers[0],'301')!==false && isset($headers['Location'])) { $location = $headers['Location']; $url = parse_url($url); $location = parse_url($location); if ($url['host'] != $location['host']) return true; } } return false; } echo (int)_is_short_url('http://bit.ly/1GoNYa');