检查 URL 是不是有 http:// 前缀

Posted

技术标签:

【中文标题】检查 URL 是不是有 http:// 前缀【英文标题】:Check if an URL has got http:// prefix检查 URL 是否有 http:// 前缀 【发布时间】:2011-04-16 21:22:30 【问题描述】:

在我的应用程序中,当用户添加一个对象时,也可以为这个对象添加一个链接,然后可以在 webView 中打开该链接。 我试图保存一个不带 http:// 前缀的链接,然后在 webView 中打开它,但无法打开它! 在 webView 开始加载之前,有没有办法检查保存的 URL 是否有 http:// 前缀?如果还没有,我该如何在 URL 中添加前缀? 谢谢!

【问题讨论】:

【参考方案1】:

在 WKNavigationDelegate 的函数 'navigationAction' 中

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) 
        if navigationAction.navigationType == .linkActivated 
            if let url = navigationAction.request.url 
                decisionHandler(.cancel)
                var urlString = url.absoluteString
                if urlString.lowercased().hasPrefix("http://") == false 
                    urlString = String(format: "http://%@", urlString)
                

                let safariViewController = SFSafariViewController(url: url)
                presentInFullScreen(safariViewController, animated: true, completion: nil)
             else 
                decisionHandler(.allow)
            
         else 
            decisionHandler(.allow)
        
    

【讨论】:

【参考方案2】:

最好在URL 对象上使用scheme 属性:

extension URL 
    var isHTTPScheme: Bool 
        return scheme?.lowercased().contains("http") == true // or hasPrefix
    

示例用法:

let myURL = URL(string: "https://***.com/a/48835119/1032372")!
if myURL.isHTTPScheme 
    // handle, e.g. open in-app browser:            
    present(SFSafariViewController(url: url), animated: true)
 else if UIApplication.shared.canOpenURL(myURL) 
    UIApplication.shared.openURL(myURL)

【讨论】:

【参考方案3】:

您可以使用方案属性来检查它。比如……

if ([yourURL.scheme isEqualToString:@"http"] || [yourURL.scheme isEqualToString:@"https"]) 
    ...
 

【讨论】:

【参考方案4】:

我在Swift中为String写了一个扩展,看看url字符串是http还是https

extension String

    func isValidForUrl()->Bool

        if(self.hasPrefix("http") || self.hasPrefix("https"))
            return true
        
        return false
    


if(urlString.isValidForUrl())
    
      //Do the thing here.

【讨论】:

【参考方案5】:

您可以在 NSString 上使用- (BOOL)hasPrefix:(NSString *)aString 方法来查看包含您的 URL 的 NSString 是否以 http:// 前缀开头,如果不是则添加前缀。

NSString *myURLString = @"www.google.com";
NSURL *myURL;
if ([myURLString.lowercaseString hasPrefix:@"http://"]) 
    myURL = [NSURL URLWithString:myURLString];
 else 
    myURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@",myURLString]];

我目前不在我的 mac 上,无法编译/测试这段代码,但我相信上面的方法应该可以工作。

【讨论】:

此测试以“HTTP://www.google.com”中断。它也不支持 ftp://,尽管 UIWebView 支持。 我认为我的回答提供了足够的信息,马修可以解决他的问题。 是的,格雷格,这就是我要找的……我将只支持 http 协议,因为它是唯一可以在我的应用程序中提供服务的协议……;) 检查不区分大小写的前缀使用这个:***.com/a/18264768/1162959【参考方案6】:

我不确定是否有任何方法可以检查,但您可以在代码中检查。

尝试使用

NSRange range = [urlString rangeOfString:@"http://"];
if (range.location != NSNotFound)
    // Add http://  

【讨论】:

【参考方案7】:

首先,您应该为 NSURL 创建一个新类别:文件 > 新文件 > Objective-C 类别。您可以按照 HTTPURLWithString 的方式调用该类别,使其成为 NSURL 的类别,然后按下一步并将其添加到您的目标。然后在 NSURL+HTTPURLFromString.m 中实现以下消息(并在您的 .h 中声明该消息)

@implementation NSURL (HTTPURLFromString)
+(NSURL *)HTTPURLFromString:(NSString *)string

    NSString *searchString = @"http";
    NSRange prefixRange = [string rangeOfString:searchString options:(NSCaseInsensitiveSearch | NSAnchoredSearch)];

    if (prefixRange.length == 4) 
        return [NSURL URLWithString:string];
    
    return [NSURL URLWithString:[NSString stringWithFormat:@"http://%@", string]];


@end

在WebView中打开链接很简单

NSString *urlString = @"www.google.com";
NSURL *url = [NSURL HTTPURLFromString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView.mainFrame loadRequest:request];

【讨论】:

【参考方案8】:

如果您正在检查“http://”,您可能需要不区分大小写的搜索:

// probably better to check for just http instead of http://
NSRange prefixRange = 
    [temp rangeOfString:@"http" 
                options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
if (prefixRange.location == NSNotFound)

尽管根据您的具体情况,我认为 url 方案检查是一个更好的答案,因为 URL 可以以 http 或 https 以及其他前缀开头,具体取决于您的用例。

【讨论】:

【参考方案9】:
NSString * urlString = ...;
NSURL * url = [NSURL URLWithString:urlString];
if (![[url scheme] length])

  url = [NSURL URLWithString:[@"http://" stringByAppendingString:urlString]];

【讨论】:

这可能是一个解决方案,但是这种方法将 http:// 添加到 URL...如果 URL 有 http://,这个方法是什么? 此代码将“http://”添加到所有没有方案的 URL。 “blah”具有“http”方案,因此[[url scheme] length] 不为零,代码保持原样。

以上是关于检查 URL 是不是有 http:// 前缀的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 检查页面 url 中是不是包含 www?

在 PostgreSQL 数据库中搜索前缀

PHP检查字符串是不是包含不带http://的url

如何检查字符串是不是以多个前缀之一开头?

检查一个字符串是不是是另一个字符串的前缀

如何在php中检查当前的url,然后比较它是不是有一个特定的单词/短语