tsk*_*tsk 5 javascript iphone objective-c uiwebview ios
大家.
我正在尝试在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);
}
Run Code Online (Sandbox Code Playgroud)
第一个NSLog返回正确的图像的src,但第二个NSLog没有返回任何内容.
2013-01-25 00:51:23.253 WebDemo[3416:907] firstUrl: https://www.paypalobjects.com/en_US/i/scr/pixel.gif
2013-01-25 00:51:23.254 WebDemo[3416:907] images :
Run Code Online (Sandbox Code Playgroud)
我不知道为什么.请帮我...
谢谢.
Rob*_*Rob 12
Perrohunter指出了一个NSRegularExpression很好的解决方案.如果您不想枚举匹配数组,也可以使用基于块的enumerateMatchesInString方法:
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);
}];
Run Code Online (Sandbox Code Playgroud)
我还更新了正则表达式模式来处理以下问题:
img标记和属性之间可以有src属性;src和之前可以有属性>;img标签中间可以有换行符(.捕获除换行符之外的所有内容);src属性值可以用被引用'以及"; 和src和=之间以及之间=和后续值之间可以有空格.我自由地认识到阅读正则表达式模式对于没有经验的人来说是痛苦的,也许其他解决方案可能更有意义(Joris的JSON建议,使用扫描仪等).但是如果你想使用正则表达式,上面的模式可能会覆盖img标签的一些更多的排列,并且enumerateMatchesInString可能比这更有效matchesInString.
Jor*_*ers 11
我不喜欢正则表达式,所以这是没有它们的答案.
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);
})()
Run Code Online (Sandbox Code Playgroud)
你会注意到我在这里返回一个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);
Run Code Online (Sandbox Code Playgroud)
您可以在加载的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);
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常基本的正则表达式,匹配标签内的任何内容,如果您的图像具有更多属性,如类或ID,则需要更多详细信息
| 归档时间: |
|
| 查看次数: |
8535 次 |
| 最近记录: |