检查 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:// 前缀的主要内容,如果未能解决你的问题,请参考以下文章