MarshalS Ответов: 3

Как проверить, является ли указанная строка допустимым URL-адресом или нет, используя код C++


существует любой возможный способ проверить, является ли указанная строка допустимым url-адресом или нет. Решение должно быть на языке c++ и работать без интернета.

пример строки

хорошо.утром
фу.ГОО.ку
https://hhhh
hdajdklbcbdhd
8881424.сайт www.hfbn55.ко.в/sdfsnhjk
://dgdh24.vom
dfgdfgdf(2001)/. com/sdgsgh
\adiihsdfghnhg.ко.inskdhhj
АСЭР//ВСП.gtyuh.ко.Великобритания/kdsfgdfgfrgj

Что я уже пробовал:

код #include "файл stdafx.ч"
#включить & lt;windows. h>
использование системы пространств имен;
использование пространства имен System:: IO;
int iDomCount =0;
пустота доминирует();
void main(int argc, _TCHAR* argv[])
{

CString Uri, Temp, strDname;
инт мот,МПК,илен;
чар функция cstr;
пробовать
{
cout<< " введите Url\n";
Uri=Console:: ReadLine();
Temp=Uri;
if ((Uri. Find(L "https", 0)) >= 0)
Ури=Ури.Средний(8);
else if ((Uri. Find(L "http", 0)) >= 0)
Ури=Ури.Средний(7);
if ((Uri. Find(L " www.", 0)) >= 0)
Ури=Ури.Средний(4);
для (тип int лен=0;лен &ЛТ; Ури.Метода getlength может служить метод();лен++)
{
МПК=Ури.GetAt(лен);
if ( ((iAsc > 64) && (iAsc < 91)) || ((iAsc & gt; 96) & & amp; (iAsc < 123)) | / ((iAsc & gt; 47) & & amp; (iAsc < 58)) | / (iAsc = = 46) | /(iAsc == 45))
мот++;
ещё
перерыв;
}
if (iLoc < 1)
{
cout<< " недопустимый Url-адрес";
система ("пауза");
Ури="";
Консоль:: Очистить();
}
ещё
{
Uri=Uri. Mid(0, (iLoc));
инт нашла=Ури.ReverseFind(Л'.');
if (ifound < 0)
{
cout<< " недопустимый Url-адрес";
система ("пауза");
Ури="";
Консоль:: Очистить();
}
ещё
{
strDname=Uri. Mid(ifound);


}
}

}
ловить(...)
{
}
}
пустота доминирует()
{
StreamReader^ sr = gcnew StreamReader( "dnmout.txt" );
Строки^ ;

// Чтение и отображение строк из файла до конца
// файл достигнут.
while (line = sr- & gt;ReadLine() )
{
Однако стр3(линия);
char *sz;
sprintf(sz, "%S", str3);
dname[iDomCount]=sz;
iDomCount ++;
}
}


//это код, который я пробовал. но он работает только с предопределенным списком поддоменов, я также пробовал регулярное выражение С c++, но оно не будет работать со всеми типами url. пожалуйста, любое решение для этого.

Mohibur Rashid

Я бы предложил использовать регулярное выражение. Pcre - это ваш инструмент.

3 Ответов

Рейтинг:
2

Jochen Arndt

Некоторые из ваших примеров строк не являются допустимыми URL-адресами (см. Единый локатор ресурсов-Википедия, свободная энциклопедия[^]) или действительные URI (Единый идентификатор ресурса-Википедия, свободная энциклопедия[^]). Поэтому вы должны сначала определить, что разрешено / должно поддерживаться.

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

Затем разделите входные данные на части и проверьте каждую часть, используя определенные для нее правила.

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


Рейтинг:
1

User 59241

Видеть здесь: проверка-какие символы делают URL-адрес недействительным? - переполнение стека[^]
Лучшее место для начала-это Функция IsValidURL (Windows)[^] или Функция PathIsURL (Windows)[^]

#include<iostream>
#include<windows.h>
#include <tchar.h>
#include <urlmon.h>
#pragma comment(lib, "urlmon.lib")
#pragma comment(lib,"wininet.lib")

using namespace std;

void testURL(LPCTSTR Url)
{
	HRESULT hr;

	hr = IsValidURL(NULL, Url, 0);
	switch (hr)
	{
	case S_OK:
		cout << "The szURL parameter contains a valid URL.\n";
		break;
	case S_FALSE:
		cout << "The szURL parameter does not contain a valid URL.\n";
		break;
	case E_INVALIDARG:
		cout << "One of the parameters is invalid.\n";
		break;
	default:
		cout << "Unknown error\n";
		break;
	}
	printf("%x", hr);
}

int main() {
	LPCTSTR Url = _T("http://www.codeproject.com/Questions/1114838/How-to-check-a-specified-string-is-a-valid-URL-or");

	testURL(Url);

	return 0;
}


Результаты могут быть проверены с помощью этого онлайн-валидатора: Проверка URL-адреса-FormValidation[^]


MarshalS

проверьте приведенный выше код со следующими ложными URL-адресами
http://www.good.morinig
http://notavalid.url.yesorno
google.com
facebbok.com
** использование без http и https

является ли этот результат достоверным?

[no name]

В чем проблема?

Рейтинг:
1

Patrice T

Попробуйте RegEx (Регулярные Выражения).
Вы найдете в Google некоторые регулярные выражения, которые будут соответствовать URL-адресу, например:

^((http[s]?|ftp):\/)?\/?([^:\/\s]+)((\/\w+)*\/)([\w\-\.]+[^#?\s]+)(.*)?(#[\w\-]+)?$

javascript-что такое хорошее регулярное выражение для соответствия URL-адресу? - переполнение стека[^]
http://code.tutsplus.com/tutorials/8-regular-expressions-you-should-know--net-6149[^]
Инструменты отладки регулярных выражений:
Debuggex: онлайн-тестер визуальных регулярных выражений. JavaScript, Python и PCRE.[^]
.Объем тестер регулярное выражение - регулярное выражение шторм[^]

Цитата:
Я также пробовал регулярное выражение С c++, но оно не будет работать со всеми типами url-адресов. пожалуйста, любое решение для этого.
Это работает, это просто вопрос создания правильного регулярного выражения .