如何在 c# WinForms WebView2 中更容易区分字符串和 url

How to differentiate between a string and a url easier in c# WinForms WebView2

所以我有这个巨大的代码,它按预期工作,转到相应的 URL,如果它不是 URL,它会去搜索字符串。问题是

  1. 已关闭但存在或未给出响应的网站被视为非 URL,因此正在搜索
  2. 多次 ping 同一站点会导致被阻止,例如 google。
  3. 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");
        }

检查这是否改进了您的用例。