มีUri.IsWellFormedUriString
และUri.TryCreate
วิธีการ แต่พวกเขาดูเหมือนจะกลับtrue
สำหรับเส้นทางไฟล์ ฯลฯ
ฉันจะตรวจสอบได้อย่างไรว่าสตริงนั้นเป็น URL HTTP ที่ถูกต้อง (ไม่จำเป็นต้องใช้งาน) สำหรับการตรวจสอบความถูกต้องของอินพุต
มีUri.IsWellFormedUriString
และUri.TryCreate
วิธีการ แต่พวกเขาดูเหมือนจะกลับtrue
สำหรับเส้นทางไฟล์ ฯลฯ
ฉันจะตรวจสอบได้อย่างไรว่าสตริงนั้นเป็น URL HTTP ที่ถูกต้อง (ไม่จำเป็นต้องใช้งาน) สำหรับการตรวจสอบความถูกต้องของอินพุต
คำตอบ:
ลองใช้วิธีนี้เพื่อตรวจสอบความถูกต้องของ URL HTTP ( uriName
คือ URI ที่คุณต้องการทดสอบ):
Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult)
&& uriResult.Scheme == Uri.UriSchemeHttp;
หรือหากคุณต้องการยอมรับทั้ง HTTP และ HTTPS URL ว่าถูกต้อง (ตามความคิดเห็นของ J0e3gan):
Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult)
&& (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps;
วิธีนี้ใช้ได้ดีทั้งใน http และ https แค่บรรทัดเดียว :)
if (Uri.IsWellFormedUriString("https://www.google.com", UriKind.Absolute))
MSDN: IsWellFormedUriString
file://
หรือldap://
วิธีการนี้ควรควบคู่กับการตรวจสอบกับรูปแบบ - เช่นif (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps) ...
public static bool CheckURLValid(this string source)
{
Uri uriResult;
return Uri.TryCreate(source, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp;
}
การใช้งาน:
string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
//valid process
}
อัปเดต: (รหัสเดียวบรรทัด) ขอบคุณ @GoClimbColorado
public static bool CheckURLValid(this string source) => Uri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps;
การใช้งาน:
string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
//valid process
}
Uri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps
ทุกคำตอบที่นี่ทั้งอนุญาตให้ URL ที่มีรูปแบบอื่น ๆ (เช่น, file://
, ftp://
) หรือปฏิเสธ URL ที่มนุษย์สามารถอ่านได้ที่ไม่ได้เริ่มต้นด้วยhttp://
หรือhttps://
(เช่นwww.google.com
) ซึ่งไม่เป็นผลดีเมื่อต้องรับมือกับปัจจัยการผลิตของผู้ใช้
นี่คือวิธีที่ฉันทำ:
public static bool ValidHttpURL(string s, out Uri resultURI)
{
if (!Regex.IsMatch(s, @"^https?:\/\/", RegexOptions.IgnoreCase))
s = "http://" + s;
if (Uri.TryCreate(s, UriKind.Absolute, out resultURI))
return (resultURI.Scheme == Uri.UriSchemeHttp ||
resultURI.Scheme == Uri.UriSchemeHttps);
return false;
}
การใช้งาน:
string[] inputs = new[] {
"https://www.google.com",
"http://www.google.com",
"www.google.com",
"google.com",
"javascript:alert('Hack me!')"
};
foreach (string s in inputs)
{
Uri uriResult;
bool result = ValidHttpURL(s, out uriResult);
Console.WriteLine(result + "\t" + uriResult?.AbsoluteUri);
}
เอาท์พุท:
True https://www.google.com/
True http://www.google.com/
True http://www.google.com/
True http://google.com/
False
http://mooooooooo
ในความเป็นจริง Uri ที่ถูกต้อง ดังนั้นคุณไม่สามารถตรวจสอบUri.IsWellFormedUriString
หลังจากใส่ "http: //" และหากคุณตรวจสอบก่อนหน้านี้สิ่งใดก็ตามที่ไม่มีScheme
จะถูกปฏิเสธ บางทีสิ่งที่สามารถทำได้คือเราตรวจสอบs.Contains('.')
แทน
IsWellFormedUriString
ก่อนที่จะเพิ่มhttp://
คุณจะจบลงด้วยการปฏิเสธสิ่งที่ชอบgoogle.com
และถ้าคุณใช้มันหลังจากที่เพิ่มก็ยังจะกลับจริงสำหรับhttp://
http://mooooooooo
นั่นเป็นเหตุผลที่ฉันแนะนำให้ตรวจสอบว่าสตริงมี.
แทน
หลังจากUri.TryCreate
คุณสามารถตรวจสอบUri.Scheme
เพื่อดูว่าเป็น HTTP หรือไม่
ลองที่:
bool IsValidURL(string URL)
{
string Pattern = @"^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$";
Regex Rgx = new Regex(Pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
return Rgx.IsMatch(URL);
}
จะยอมรับ URL แบบนั้น:
สิ่งนี้จะคืนค่าบูล:
Uri.IsWellFormedUriString(a.GetAttribute("href"), UriKind.Absolute)
Uri uri = null;
if (!Uri.TryCreate(url, UriKind.Absolute, out uri) || null == uri)
return false;
else
return true;
นี่url
คือสตริงที่คุณต้องทดสอบ
bool passed = Uri.TryCreate(url, UriKind.Absolute, out Uri uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps)