如何在 c# WinForms WebView2 中更容易区分字符串和 url
How to differentiate between a string and a url easier in c# WinForms WebView2
所以我有这个巨大的代码,它按预期工作,转到相应的 URL,如果它不是 URL,它会去搜索字符串。问题是
- 已关闭但存在或未给出响应的网站被视为非 URL,因此正在搜索
- 多次 ping 同一站点会导致被阻止,例如 google。
- ping 方法响应时间过长。
[...]
try
{
timer1.Start();
if (SearchBox.Text.Contains(SearchBox.Text.ToString()))
{
if (webView21 != null && webView21.CoreWebView2 != null)
{
Ping pingSender = new Ping();
PingOptions options = new PingOptions();
// Use the default Ttl value which is 128,
// but change the fragmentation behavior.
options.DontFragment = true;
// Create a buffer of 32 bytes of data to be transmitted.
string data = "aaa";
byte[] buffer = Encoding.ASCII.GetBytes(data);
int timeout = 0;
PingReply reply = pingSender.Send(SearchBox.Text.ToString(), timeout, buffer, options);
if (reply.Status == IPStatus.Success)
{
if (SearchBox.Text.StartsWith("https://"))
{
webView21.CoreWebView2.Navigate(SearchBox.Text);
}
else if (SearchBox.Text.StartsWith("http://"))
{
webView21.CoreWebView2.Navigate(SearchBox.Text);
}
else
{
webView21.CoreWebView2.Navigate("https://" + SearchBox.Text);
}
}
else
{
webView21.CoreWebView2.Navigate("https://duckduckgo.com/?q=" + SearchBox.Text + "&t=h_&ia=web");
}
}
}
else if (SearchBox.Text.StartsWith("https://"))
{
if (webView21 != null && webView21.CoreWebView2 != null)
{
webView21.CoreWebView2.Navigate(SearchBox.Text);
}
}
else if (SearchBox.Text.StartsWith("http://"))
{
if (webView21 != null && webView21.CoreWebView2 != null)
{
webView21.CoreWebView2.Navigate(SearchBox.Text);
}
}
else
{
if (webView21 != null && webView21.CoreWebView2 != null)
{
webView21.CoreWebView2.Navigate(SearchBox.Text);
}
}
}
catch
{
timer1.Start();
webView21.CoreWebView2.Navigate("https://duckduckgo.com/?q=" + SearchBox.Text + "&t=h_&ia=web");
}
}
有人知道我该如何改进吗?我怎样才能让我的网络浏览器在这方面更有效率。也许是正则表达式?
TBH 我想你可以用这样的东西替换你的整个代码:
string userInputtedString = SearchBox.Text;
// CHeck for a valid URI.
Uri uriResult;
bool validUrlResult = Uri.TryCreate(userInputtedString, UriKind.Absolute, out uriResult)
&& (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
if (validUrlResult)
{
webView21.CoreWebView2.Navigate(userInputtedString);
}
else
{
// We haven't gotten a valid url, so we're gonna search instead.
webView21.CoreWebView2.Navigate("https://duckduckgo.com/?q=" + userInputtedString + "&t=h_&ia=web");
}
编辑:
显然 Uri
需要一个方案(http://
或 https://
或 file://
等)来构造 Uri
class。因此 google.com 失败的原因 - 浏览器会自动添加 http(s)://
方案,这就是如果您在浏览器中键入它就可以工作的原因。
我认为对于您的情况,您可以尝试其他答案:
bool IsValidURL(string URL)
{
string Pattern = @"^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!$&'\(\)\*\+,;=.]+$";
Regex Rgx = new Regex(Pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
return Rgx.IsMatch(URL);
}
所以会变成这样:
string userInputtedString = SearchBox.Text;
// CHeck for a valid URI.
Uri uriResult;
bool validUrlResult = IsValidURL(userInputtedString);
if (validUrlResult)
{
webView21.CoreWebView2.Navigate(userInputtedString);
}
else
{
// We haven't gotten a valid url, so we're gonna search instead.
webView21.CoreWebView2.Navigate("https://duckduckgo.com/?q=" + userInputtedString + "&t=h_&ia=web");
}
检查这是否改进了您的用例。
所以我有这个巨大的代码,它按预期工作,转到相应的 URL,如果它不是 URL,它会去搜索字符串。问题是
- 已关闭但存在或未给出响应的网站被视为非 URL,因此正在搜索
- 多次 ping 同一站点会导致被阻止,例如 google。
- ping 方法响应时间过长。
[...]
try
{
timer1.Start();
if (SearchBox.Text.Contains(SearchBox.Text.ToString()))
{
if (webView21 != null && webView21.CoreWebView2 != null)
{
Ping pingSender = new Ping();
PingOptions options = new PingOptions();
// Use the default Ttl value which is 128,
// but change the fragmentation behavior.
options.DontFragment = true;
// Create a buffer of 32 bytes of data to be transmitted.
string data = "aaa";
byte[] buffer = Encoding.ASCII.GetBytes(data);
int timeout = 0;
PingReply reply = pingSender.Send(SearchBox.Text.ToString(), timeout, buffer, options);
if (reply.Status == IPStatus.Success)
{
if (SearchBox.Text.StartsWith("https://"))
{
webView21.CoreWebView2.Navigate(SearchBox.Text);
}
else if (SearchBox.Text.StartsWith("http://"))
{
webView21.CoreWebView2.Navigate(SearchBox.Text);
}
else
{
webView21.CoreWebView2.Navigate("https://" + SearchBox.Text);
}
}
else
{
webView21.CoreWebView2.Navigate("https://duckduckgo.com/?q=" + SearchBox.Text + "&t=h_&ia=web");
}
}
}
else if (SearchBox.Text.StartsWith("https://"))
{
if (webView21 != null && webView21.CoreWebView2 != null)
{
webView21.CoreWebView2.Navigate(SearchBox.Text);
}
}
else if (SearchBox.Text.StartsWith("http://"))
{
if (webView21 != null && webView21.CoreWebView2 != null)
{
webView21.CoreWebView2.Navigate(SearchBox.Text);
}
}
else
{
if (webView21 != null && webView21.CoreWebView2 != null)
{
webView21.CoreWebView2.Navigate(SearchBox.Text);
}
}
}
catch
{
timer1.Start();
webView21.CoreWebView2.Navigate("https://duckduckgo.com/?q=" + SearchBox.Text + "&t=h_&ia=web");
}
}
有人知道我该如何改进吗?我怎样才能让我的网络浏览器在这方面更有效率。也许是正则表达式?
TBH 我想你可以用这样的东西替换你的整个代码:
string userInputtedString = SearchBox.Text;
// CHeck for a valid URI.
Uri uriResult;
bool validUrlResult = Uri.TryCreate(userInputtedString, UriKind.Absolute, out uriResult)
&& (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
if (validUrlResult)
{
webView21.CoreWebView2.Navigate(userInputtedString);
}
else
{
// We haven't gotten a valid url, so we're gonna search instead.
webView21.CoreWebView2.Navigate("https://duckduckgo.com/?q=" + userInputtedString + "&t=h_&ia=web");
}
编辑:
显然 Uri
需要一个方案(http://
或 https://
或 file://
等)来构造 Uri
class。因此 google.com 失败的原因 - 浏览器会自动添加 http(s)://
方案,这就是如果您在浏览器中键入它就可以工作的原因。
我认为对于您的情况,您可以尝试其他答案:
bool IsValidURL(string URL)
{
string Pattern = @"^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!$&'\(\)\*\+,;=.]+$";
Regex Rgx = new Regex(Pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
return Rgx.IsMatch(URL);
}
所以会变成这样:
string userInputtedString = SearchBox.Text;
// CHeck for a valid URI.
Uri uriResult;
bool validUrlResult = IsValidURL(userInputtedString);
if (validUrlResult)
{
webView21.CoreWebView2.Navigate(userInputtedString);
}
else
{
// We haven't gotten a valid url, so we're gonna search instead.
webView21.CoreWebView2.Navigate("https://duckduckgo.com/?q=" + userInputtedString + "&t=h_&ia=web");
}
检查这是否改进了您的用例。