Php является ли строка url

Проверьте, является ли строка URL-адресом, закодированным в PHP

Вышеприведенный код работает, но не в тех случаях, когда строка была дважды закодирована, как в этих примерах:

Как строка будет закодирована в URL к тому времени, когда ваш PHP-скрипт ее увидит? Действительно ли проблема заключается в том, что вашему сценарию необходимо декодировать URL-адрес входящей строки, или же проблема заключается в том, что вашему сценарию не требуется, например, двойное кодирование ссылки или входного значения?

Как насчет использования urldecode и сравнения его с исходной строкой. Если они совпадают, это еще не закодировано.

11 ответов

Вы никогда не узнаете наверняка, является ли строка кодировкой URL или предполагается, что в ней должна быть последовательность %2B . Вместо этого, вероятно, это зависит от того, откуда взялась строка, т.е. Если она была обработана вручную или из какого-либо приложения.

Лучше ли искать строку для символов, которые будут закодированы, а какие нет, и если они существуют, то это не закодировано.

Я думаю, что это лучший подход, поскольку он будет заботиться о вещах, которые были сделаны программно (при условии, что приложение не оставило бы некодированный символ позади).

Одна вещь, которая будет вводить в заблуждение здесь. Технически, % «должен быть» закодирован, если он будет присутствовать в конечном значении, поскольку он является особым символом. Возможно, вам придется комбинировать свои подходы, чтобы искать символы с кодировкой, а также проверять, что строка успешно декодируется, если ни один не найден.

«предполагается, что в нем есть последовательность %2B », его decode-check-encode-check является попыткой противостоять этому (декодировать в пространство, кодировать в% 2B, не кодировать)

Правда, если только не было намерения передать эту последовательность в качестве окончательного значения . Ваш арифметический пример — лучший пример, где это не получится. Вместо этого, проверяя символы, которые «должны были» быть закодированы, приложение получает немного лучшую подсказку, была ли строка уже закодирована.

В частности, символ:, который является обязательным разделителем в действительном uris ( tools.ietf.org/html/rfc3986 ), не будет присутствовать в строке с кодировкой urlen .

вы можете сделать это, чтобы избежать двойного кодирования. Каждый раз при первом декодировании он снова кодируется;

Выполняя этот путь, мы можем избежать двойного кодирования:)

Это не правильно! URL, который когда-то декодируется, не может быть закодирован таким же образом. Для получения дополнительной информации проверьте: blog.lunatech.com/2009/02/03/… Например, «a + b» в качестве параметра пути является допустимым. Затем, если вы расшифруете его, у вас будет та же строка (a + b), и после кодирования результат будет «% 2Bb»!

Читайте также:  Java app to exe

Это приведет к неприятностям. Например, если у вас есть простая текстовая строка со знаком плюс, например: «TestString Super Mega +» Знак плюс будет удален, если вы передадите его через urldecode ();

Вот что я только что собрал.

if ( urlencode(urldecode($data)) === $data) < echo 'string urlencoded'; >else

@suther, пожалуйста, проверьте его с различными входами, я не помню, но иногда это не работает, как ожидалось.

Я думаю, что нет надежного способа сделать это. Например, рассмотрим следующее:

Является ли этот URL закодированным «A B» или он должен быть закодирован в «A% 2BB»?

Нет надежного способа сделать это, так как есть строки, которые остаются неизменными в процессе кодирования, то есть «abc» закодированы или нет? Нет четкого ответа. Кроме того, как вы столкнулись, некоторые символы имеют несколько кодировок. Но.

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

Конечно, это не будет дураком, поскольку «10 + 20 = 30» вернет true (+ преобразуется в космос), но мы на самом деле просто делаем арифметику. Я предполагаю, что это то, что вы пытаетесь скрыть, — я сожалею, что не думаю, что там идеальное решение.

Edit:
Как я уже упоминал в своем собственном комментарии (просто повторяя здесь для ясности), хорошим компромиссом, вероятно, будет проверка наличия недопустимых символов в вашем URL-адресе (например, пробел), и если они некоторые не закодированы. Если их нет, попробуйте декодировать и посмотреть, меняется ли строка. Это все равно не будет обрабатывать вышеизложенную арифметику (что невозможно), но, надеюсь, будет достаточно.

«Однако небольшая модификация вашей функции должна быть достаточно надежной, просто проверьте, изменяет ли декодирование строку, если это так, то она была закодирована». Я думал, что это, однако, если это строка «Hello + World, как дела», то декодирование приведет к изменению, но оно не было бы полностью закодировано.

@Psytronic: Совершенно верно, что + это подонок, не так ли? Если вы можете найти способ определить, является ли это действительный URL-адрес, а затем расшифровка для проверки изменений, вероятно, будет лучшим решением. Вы должны иметь возможность придумать регулярное выражение для поиска «плохих» символов, таких как пробел (если оно недопустимо, оно не закодировано).

ну, термин «закодированный url» немного расплывчатый, возможно простая проверка регулярных выражений сделает трюк

$is_encoded = preg_match('~%[0-9A-F]~i', $string); 

Источник

проверьте, является ли строка URL-адресом

Я видел много вопросов, но не мог понять, как это работает, поскольку я хочу более простой случай.

Если у нас есть текст, что бы это ни было, я бы хотел проверить, является ли он URL-адресом или нет.

$text = "something.com"; //this is a url if (!IsUrl($text))< echo "No it is not url"; exit; // die well >else < echo "Yes it is url"; // my else codes goes >function IsUrl($url)< // . > 

Есть ли другой способ, а не проверка с помощью JavaScript в случае блокировки JS?

)"; // Host or IP $regex .= "(\:6)?"; // Port $regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path $regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query $regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor if(preg_match("/^$regex$/i", $url)) // `i` flag for case-insensitive < return true; >?> 

но ваш примерный URL-адрес упрощен, (\w+)\.(\w+) соответствует ему. кто-то еще упомянул filter_var который является просто filter_var($url, FILTER_VALIDATE_URL) но , похоже, он не похож на символы, отличные от ascii, поэтому будьте осторожны …

Читайте также:  Python pack struct example

Функция filter_var PHP – это то, что вам нужно. Найдите FILTER_VALIDATE_URL . Вы также можете установить flags для точной настройки вашей реализации.
Нет необходимости в регулярном выражении ….

Следующий код работал для меня:

if(filter_var($text, FILTER_VALIDATE_URL)) < echo "Yes it is url"; exit; // die well >else < echo "No it is not url"; // my else codes goes > 

Вы также можете указать соответствие RFC и другие требования к URL-адресу с использованием флагов. См. PHP Validate Filters для получения более подробной информации.

Проверьте, является ли он действительным URL (example.com НЕ является допустимым URL)

 if(!isValidURL($fldbanner_url)) < $errMsg .= "* Please enter valid URL including http://
"; >

Regexes – плохой способ проверить что-то сложное, как URL.

Функция filter_var () PHP предлагает гораздо более надежный способ проверки URL-адресов. Кроме того, это быстрее, так как это собственный код.

Я не думаю, что на это есть окончательный ответ. Пример действительного URL:

localhost http://xxx.xxx.xxx/alkjnsdf abs.com 

Если у вас есть текст. и не большая его часть. Вы можете проверить, выполнив запрос CURL и посмотрите, возвращает ли он действительный ответ. В противном случае, если я ставлю localhost, это может быть ссылка, и это может быть что-то еще, и вы не сможете проверить это.

function isValidUrl($url) < return preg_match("(?i)\b((?:[az][\w-]+:(?:/|[a-z0-9%])|www\d[.]|[a-z0-9.\-]+[.][az]/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]<>;:'\".,<>?«»“”'']))", $url) > 0; > 

( Источник регулярных выражений )

Вы можете использовать следующий шаблон регулярного выражения, чтобы проверить, является ли ваша переменная URL-адресом или нет:

Что-то вроде может сработать для вас:

$arr = array('abc.com/foo', 'localhost', 'abc+def', 'how r u', 'https://how r u', 'ftp://abc.com', 'a.b'); foreach ($arr as $u) < $url = $u; if (!preg_match('#^(?:https?|ftp)://#', $url, $m)) $url = 'http://' . $url; echo "$u =>"; var_dump(filter_var($url, FILTER_VALIDATE_URL)); > 
abc.com/foo => string(18) "http://abc.com/foo" localhost => string(16) "http://localhost" abc+def => string(14) "http://abc+def" how ru => bool(false) https://how ru => bool(false) ftp://abc.com => string(13) "ftp://abc.com" ab => string(10) "http://ab" 

Таким образом, в основном везде, где вы видите false как возвращаемое значение, которое является URL-адресом INVALID для вас.

Читайте также:  Drag and drop javascript framework

Источник

Как проверить, является ли данная строка реальным URL в PHP?

Мне нужно найти лучший способ (с точки зрения производительности), чтобы найти, является ли данная строка URL-адресом.
REGEXP не поможет, так как www.eeeeeeeeeeeeee.bbbbbbbbbbbbbbbbb.com — это действительное имя URL-адреса, но не в любой сети, известной человеку.
Я думаю, используя CURL и вижу, возвращаю ли статус 200 назад или просто file_get_contents и анализирую результат.
Есть ли лучший способ?

Вы можете получить 301 302 и некоторые другие коды, которые действительны, поэтому не просто проверяйте 200.

Не делай этого, я имел в виду www.eeeeeeeeeeeeeeeeee.bbbbbbbbbbbbb.com, а не www.eeeeeeeeeeeeeee.bbbbbbbbbbbbbbbb.com

Я убираю это, кажется, что некоторые, как все длинные повторяющиеся домены символов, где купил. Так что eeeeeeeee.fffffffffffffffff.com принадлежит кому-то, а eeeeeeeee.ffffgfffffff.com — нет.

5 ответов

Не извлекайте все содержимое — это может быть огромным. Выполните запрос HEAD.

Конечно, вы можете сделать некоторую проверку, — удалите вещи, которые недействительны в качестве URL-адресов, а не только URL-адреса, которые в настоящее время не обслуживаются ничем. После этого выдача запроса HEAD примерно так же хороша, как и получается. Сказав это, он становится серой областью. как насчет URL-адреса, который возвращает «авторизация»? Это может быть каталог, защищенный паролем, но если вы знаете пароль, то получите 404, потому что сам файл не существует.

Вы не имеете в виду URL-адрес, вы имеете в виду доменное имя

Я бы настоятельно предложил использовать CURL, но только заголовки, не получая никакого содержимого.

Вот функция, которую я использую для проверки правильности и нахождения данного URL.

function __checkUrl($url) < //First checking with pattern whether it is proper or not $pattern = '/^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d])+(:([\d\w]|%[a-fA-f\d])+)?@)?([\d\w][-\d\w][\d\w]\.)+[\w](:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d])*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d])=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d])*)?$/'; if (preg_match($pattern, $url)) < $ch = curl_init(); // set URL and other appropriate options curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); curl_setopt($ch, CURLOPT_NOBODY, true); curl_setopt($ch, CURLOPT_AUTOREFERER, true); curl_setopt($ch, CURLOPT_FORBID_REUSE, true); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4); curl_setopt($ch, CURLOPT_TIMEOUT, 4); // grab URL $output = curl_exec($ch); // Get response code $response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); $newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); // Not found? if ($response_code == '404') < return false; >else < return $newurl; >> else < return false; >> 

С помощью этой функции я сначала проверяю, что URL-адрес действительно действителен с помощью Regex. После этого завитка. Установив CURLOPT_FOLLOWLOCATION в true, мы заботимся о 301 и подобных перенаправлениях, но ограничиваем число. перенаправления на 3. И наконец мы возвращаем эффективный URL после всех перенаправлений.

Вы знаете, что регулярное выражение валидации URL довольно поддельное, верно? (Как подсказано в вопросе ОП.)

Источник

Оцените статью