Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何获得全部<;img src>;是否在iOS UIWebView中创建网页?_Javascript_Iphone_Ios_Objective C_Uiwebview - Fatal编程技术网

Javascript 如何获得全部<;img src>;是否在iOS UIWebView中创建网页?

Javascript 如何获得全部<;img src>;是否在iOS UIWebView中创建网页?,javascript,iphone,ios,objective-c,uiwebview,Javascript,Iphone,Ios,Objective C,Uiwebview,各位 我正在尝试在UIWebView中获取当前页面的所有图像URL 这是我的代码 - (void)webViewDidFinishLoad:(UIWebView*)webView { NSString *firstImageUrl = [self.webView stringByEvaluatingJavaScriptFromString:@"var images = document.getElementsByTagName('img');images[0].src.toString(

各位

我正在尝试在UIWebView中获取当前页面的所有图像URL

这是我的代码

- (void)webViewDidFinishLoad:(UIWebView*)webView {
    NSString *firstImageUrl = [self.webView stringByEvaluatingJavaScriptFromString:@"var images = document.getElementsByTagName('img');images[0].src.toString();"];
    NSString *imageUrls = [self.webView stringByEvaluatingJavaScriptFromString:@"var images= document.getElementsByTagName('img');var imageUrls = "";for(var i = 0; i < images.length; i++){var image = images[i];imageUrls += image.src;imageUrls += \\’,\\’;}imageUrls.toString();"];
    NSLog(@"firstUrl : %@", firstImageUrl);
    NSLog(@"images : %@",imageUrls);
}
我不知道为什么。 请帮帮我


谢谢。

您可以在加载的webview html源代码上运行正则表达式来实现这一点

NSString *yourHTMLSourceCodeString = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];

    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(<img src=\"(.*?)\">)+?"
                                                                           options:NSRegularExpressionCaseInsensitive
                                                                             error:&error];

    NSArray *matches = [regex matchesInString:yourHTMLSourceCodeString
                                      options:0
                                        range:NSMakeRange(0, [yourHTMLSourceCodeString length])];

    NSLog(@"total matches %d",[matches count]);

    for (NSTextCheckingResult *match in matches) {
        NSString *img = [yourHTMLSourceCodeString substringWithRange:[match rangeAtIndex:2]] ;
        NSLog(@"img src %@",img);
    }
NSString*yourHTMLSourceCodeString=[webView stringByEvaluatingJavaScriptFromString:@“document.body.innerHTML”];
n错误*错误=NULL;
NSRegularExpression*regex=[NSRegularExpression regular expression with pattern:@“()+?”
选项:nsregularexpressioncase不敏感
错误:&错误];
NSArray*matches=[regex matchesInstalling:yourHTMLSourceCodeString
选项:0
范围:NSMakeRange(0,[yourHTMLSourceCodeString长度]);
NSLog(@“总匹配项%d”,[匹配项计数]);
用于(NSTextCheckingResult*匹配项中的匹配项){
NSString*img=[yourHTMLSourceCodeString substringWithRange:[match RangeAtinex:2]];
NSLog(@“img src%”,img);
}

这是一个非常基本的正则表达式,可以匹配标记中的任何内容。如果您的图像具有更多属性,如class或id,则需要更多详细信息。我不喜欢正则表达式,因此下面是我的答案

javascript缩进以澄清:

// javascript to execute:
(function() {
    var images=document.querySelectorAll("img");
    var imageUrls=[];
    [].forEach.call(images, function(el) {
        imageUrls[imageUrls.length] = el.src;
    }); 
    return JSON.stringify(imageUrls);
})()
您会注意到我在这里返回了一个JSON字符串。要在Objective-C中重新阅读此内容:

NSString *imageURLString = [self.webview stringByEvaluatingJavaScriptFromString:@"(function() {var images=document.querySelectorAll(\"img\");var imageUrls=[];[].forEach.call(images, function(el) { imageUrls[imageUrls.length] = el.src;}); return JSON.stringify(imageUrls);})()"];

// parse json back into an array
NSError *jsonError = nil;
NSArray *urls = [NSJSONSerialization JSONObjectWithData:[imageURLString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&jsonError];

if (!urls) {
    NSLog(@"JSON error: %@", jsonError);
    return;
}

NSLog(@"Images : %@", urls);

Perrohunter指出了一个非常好的
NSRegularExpression
解决方案。如果不想枚举匹配数组,也可以使用基于块的方法:

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(<img\\s[\\s\\S]*?src\\s*?=\\s*?['\"](.*?)['\"][\\s\\S]*?>)+?"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:&error];

[regex enumerateMatchesInString:yourHTMLSourceCodeString
                        options:0
                          range:NSMakeRange(0, [yourHTMLSourceCodeString length])
                     usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {

                         NSString *img = [yourHTMLSourceCodeString substringWithRange:[result rangeAtIndex:2]];
                         NSLog(@"img src %@",img);
                     }];
NSError*error=NULL;
NSRegularExpression*regex=[NSRegularExpression regular expression with pattern:@“()+?”
选项:nsregularexpressioncase不敏感
错误:&错误];
[正则表达式枚举匹配安装:您的HTMLSourceCodeString
选项:0
范围:NSMakeRange(0,[yourHTMLSourceCodeString长度])
usingBlock:^(NSTextCheckingResult*结果,NSMatchingFlags标志,布尔*停止){
NSString*img=[yourHTMLSourceCodeString substringWithRange:[result RangeAtinex:2]];
NSLog(@“img src%”,img);
}];
我还更新了regex模式以处理以下问题:

  • start
    img
    标记和
    src
    属性之间可以有属性
  • src
    属性之后和
    之前可以有属性
  • 在<代码>中间IMG标签(新版字符> <代码> >捕获新行字符除外);李>
  • src
    属性值可以用
    以及
    引用;以及
  • src
    =
    之间以及
    =
    和后续值之间可以有空格

我清楚地认识到,对于新手来说,阅读正则表达式模式是一件痛苦的事情,也许其他解决方案可能更有意义(Joris的JSON建议,使用扫描仪,等等)但是,如果您想使用正则表达式,上述模式可能会覆盖更多的
img
标记排列,并且
EnumerateMatchesInstance
可能比
MatchesInstance

在给定html中的效率稍高一些,您可以使用库。使用Swift 3

do {
    let doc: Document = try SwiftSoup.parse(html)
    let srcs: Elements = try doc.select("img[src]")
    let srcsStringArray: [String?] = srcs.array().map { try? $0.attr("src").description }
    // do something with srcsStringArray
    } catch Exception.Error(_, let message) {
        print(message)
    } catch {
        print("error")
    }

对不起,我错过了,以前是晚餐match@user1928537很高兴听到这个消息:顺便说一句,如果你想发疯,你应该更加小心
img
标记,并使用像
@“()+?”
这样的正则表达式,因为(a)你可以在start
img
标记和
src
属性之间有属性;(b)您可以在<代码> SRC < /Cult>标签之后,在<代码> >代码>之前;(c)可以在<代码>中间IMG< /代码>标签中有换行符;(d)我认为<代码> Src < /Cord>属性值可以引用<代码> <代码>以及<代码> <代码>;等等。@Rob这是个很好的建议,Rob!我知道我的正则表达式需要更多的工作,我只是写了一个非常简单的:P@Rob你的正则表达式非常好。这就是我需要的。上次,你帮了我。非常感谢。对于那些不喜欢正则表达式解析html的人,请参考以下经典:谢谢。实际上,对于那些仍然喜欢正则表达式的人来说,这更重要。不喜欢正则表达式的人可能已经读过/体验过:)@JorisKluivers谢谢!你的代码运行得很好。因为我不擅长正则表达式,所以我很赞同你的建议。我不反对使用正则表达式,但与我测试过的任何类型的字符串解析相比,这种javascript方法的速度都非常快。谢谢!!这个正则表达式更有用。你太棒了。所以,我改变了“接受答案”。对不起,佩罗汉特。。。我需要学习正则表达式。
do {
    let doc: Document = try SwiftSoup.parse(html)
    let srcs: Elements = try doc.select("img[src]")
    let srcsStringArray: [String?] = srcs.array().map { try? $0.attr("src").description }
    // do something with srcsStringArray
    } catch Exception.Error(_, let message) {
        print(message)
    } catch {
        print("error")
    }