如何在Objective-C中确定一个字符串是否为URL

15

我是一名新手 iPhone 开发者,也不熟悉 Objective-C。使用 ZBar SDK,我开发了一个基本应用程序,可以扫描照片库中的 QR 图像,并输出它所翻译的内容。

我想知道是否有一种方法可以获取输出结果,判断它是否为 URL,如果是,则在浏览器中打开它。

3个回答

37

如果传递的URL无效,NSURL的URLWithString将返回nil。因此,您可以检查返回值以确定URL是否有效。

更新

仅使用URLWithString:通常是不够的,您可能还想检查url是否具有方案和主机,否则,像al:/dsfhkgdsk这样的url将通过测试。

因此,您可能需要像这样做:

NSURL *url = [NSURL URLWithString:yourUrlString];
if (url && url.scheme && url.host)
{
   //the url looks ok, do something with it
   NSLog(@"%@ is a valid URL", yourUrlString);
}

如果你只想接受 HTTP URL,你可能想要添加 [url.scheme isEqualToString:@"http"]


3
有效的URL定义似乎不太严谨。 "foo.com" 可以解析,因此您可能希望检查生成的对象是否具有scheme属性。 - drewish
3
您不能仅仅信任URLWithString方法,因为NSURL *url = [NSURL URLWithString:@"a"];会返回一个"a"字符串。请参考https://dev59.com/_XM_5IYBdhLWcg3wPAVF。 - 6 1
我的意思是,“你只需检查返回值即可确定URL是否有效。”这个语句并不足够。 - 6 1
如果我们也接受本地文件URL,那么跳过host检查是否可以? - adib
你应该检查方案的 length,因为字符串 "a" 对于它的方案返回一个空字符串。 - adib
显示剩余2条评论

3

我找到了一种替代方案,可以这样做。

NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"yourstring"]];
bool valid = [NSURLConnection canHandleRequest:req];

来源: https://stackoverflow.com/a/13650542/2513947

以下是需要翻译的内容:
在Java中,如果您想要在字符串中使用反斜杠,则必须使用两个反斜杠来表示它。例如,如果您想要将路径"C:\Windows"存储为字符串,则应编写"C:\\Windows"。
这是因为反斜杠在Java中有特殊的含义,用于表示转义序列。例如,"\n"表示换行符,"\t"表示制表符。因此,如果您只使用一个反斜杠来表示路径中的反斜杠,则Java将尝试解释它作为转义序列,并可能导致编译错误或运行时异常。

-1
您可以查看下面的代码,以检查字符串是否包含网站URL或简单文本。
 NSString *getString =[[NSUserDefaults standardUserDefaults]valueForKey:@"searchKey"];
    if([getString rangeOfString:@"Www"].location == NSNotFound
       && [getString rangeOfString:@"www"].location == NSNotFound && [getString rangeOfString:@"com"].location == NSNotFound)
    {
        [companyNameTF setText:[[NSUserDefaults standardUserDefaults]valueForKey:@"searchKey"]];
    }
    else
    {
         [websiteTF setText:[[NSUserDefaults standardUserDefaults]valueForKey:@"searchKey"]];
    }

这只在非常有限的情况下有效。即仅适用于包含“www”和“com”的URL,这绝不是所有情况。它仅在您知道URL应该是什么样子时才能起作用。 - Jake T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接