Поиск строки HTML для ссылок (Objective-C) - PullRequest
0 голосов
/ 05 ноября 2018

Это может немного смущать, так как я немного новичок в Objective-C. У меня приложение уже получает исходный код:

NSURL *URL = [NSURL URLWithString:@"google.com"];
NSString *webData= [NSString stringWithContentsOfURL:URL encoding:NSASCIIStringEncoding error:nil];

Это правильно получает исходный код, я зарегистрировал его и проверил. Я хочу найти только ссылки внутри этой строки, поэтому что-нибудь с ключевым словом:

<a href

Я попытался найти строку, например:

 if ([webData containsString:@"<a href="]) {
    NSLog(@"string contains!");
} else {
    NSLog(@"string does not contain");
}

Он всегда возвращает отрицательный результат, и я не понимаю, почему. Я хочу получить только строки кода, которые содержат ссылки, и установить эти строки в новую строку. Строка будет содержать все ссылки на источник, но я не знаю, как это сделать. Я надеюсь, что предоставил достаточно информации, и если у вас есть какие-либо вопросы по моей проблеме, пожалуйста, задавайте. Спасибо.

РЕДАКТИРОВАТЬ 1 Я попытался дать ответ, и это мой следующий код

NSURL *URL = [NSURL URLWithString:@"google.com"];
NSString *webData= [NSString stringWithContentsOfURL:URL encoding:NSASCIIStringEncoding error:nil];
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\<a href=\"(.*)\".*<\/a\>"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:&error];
NSUInteger numberOfMatches = [regex matchesInString:webData
                                                    options:0
                                                      range:NSMakeRange(0, [webData length])];

Сначала он не работает, и я получаю следующие ошибки / предупреждения: предупреждения

РЕДАКТИРОВАТЬ 2 Я попытался исправить код, и мой текущий

NSURL *URL = [NSURL URLWithString:@"google.com"];
NSString *webData= [NSString stringWithContentsOfURL:URL encoding:NSASCIIStringEncoding error:nil];
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\<a.+?\\>.+?\\<\\/a\\>"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:&error];
NSArray *matches = [regex matchesInString:webData
                          options:0
                          range:NSMakeRange(0, [webData length])];
NSLog(@"%@", matches);

Выводится журнал:

2018-11-05 00:12:51.144009-0500 InjectionTest[42684:6739102] (
"<NSSimpleRegularExpressionCheckingResult: 0x6000037b2c00>{25654, 124}{<NSRegularExpression: 0x600002ca0210> \\<a.+?\\>.+?\\<\\/a\\> 0x1}",
"<NSSimpleRegularExpressionCheckingResult: 0x6000037b2cc0>{38864, 316}{<NSRegularExpression: 0x600002ca0210> \\<a.+?\\>.+?\\<\\/a\\> 0x1}",
"<NSSimpleRegularExpressionCheckingResult: 0x6000037b2340>{39939, 105}{<NSRegularExpression: 0x600002ca0210> \\<a.+?\\>.+?\\<\\/a\\> 0x1}",
"<NSSimpleRegularExpressionCheckingResult: 0x6000037b2100>{40051, 103}{<NSRegularExpression: 0x600002ca0210> \\<a.+?\\>.+?\\<\\/a\\> 0x1}",
"<NSSimpleRegularExpressionCheckingResult: 0x6000037b2000>{40203, 125}{<NSRegularExpression: 0x600002ca0210> \\<a.+?\\>.+?\\<\\/a\\> 0x1}",
"<NSSimpleRegularExpressionCheckingResult: 0x6000037b2140>{41190, 91}{<NSRegularExpression: 0x600002ca0210> \\<a.+?\\>.+?\\<\\/a\\> 0x1}",
"<NSSimpleRegularExpressionCheckingResult: 0x6000037b0f00>{41297, 67}{<NSRegularExpression: 0x600002ca0210> \\<a.+?\\>.+?\\<\\/a\\> 0x1}",
"<NSSimpleRegularExpressionCheckingResult: 0x6000037b2d80>{41479, 124}{<NSRegularExpression: 0x600002ca0210> \\<a.+?\\>.+?\\<\\/a\\> 0x1}"

)

Я почти уверен, что это не то, что я должен получить.

1 Ответ

0 голосов
/ 05 ноября 2018

Я бы предложил использовать NSRegularExpression вместо:

Используя соответствующий шаблон, например:

\<a href=\"(.*)\".*<\/a\>

со следующей функцией:

 matchesInString:options:range:

Вы получите список A элементов в вашей строке HTML.

Подробнее читайте здесь в официальном документе Apple:

https://developer.apple.com/documentation/foundation/nsregularexpression?language=objc

** Обновление **

Пример кода, который извлекает все элементы <a> из HTML-текста:

NSURL *url = [NSURL URLWithString:@"https://www.google.com"];
NSString *html = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\<a.+?\\>.+?\\<\\/a\\>"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:nil];
NSArray *matches = [regex matchesInString:html options:0 range:NSMakeRange(0, html.length)];
for (NSTextCheckingResult *match in matches) {
    NSRange matchRange = [match range];
    NSString *matchedString = [html substringWithRange:matchRange];
    NSLog(@"%@", matchedString);
}

Вот лог сверху кода:

2018-11-05 14:30:01.252702 TestArray[1322:320814] <a class=gb1 href="https://www.google.co.jp/imghp?hl=ja&tab=wi">&#30011;&#20687;</a>
2018-11-05 14:30:01.252911 TestArray[1322:320814] <a class=gb1 href="https://maps.google.co.jp/maps?hl=ja&tab=wl">&#12510;&#12483;&#12503;</a>
2018-11-05 14:30:01.253120 TestArray[1322:320814] <a class=gb1 href="https://play.google.com/?hl=ja&tab=w8">Play</a>
2018-11-05 14:30:01.253346 TestArray[1322:320814] <a class=gb1 href="https://www.youtube.com/?gl=JP&tab=w1">YouTube</a>
2018-11-05 14:30:01.253512 TestArray[1322:320814] <a class=gb1 href="https://news.google.co.jp/nwshp?hl=ja&tab=wn">&#12491;&#12517;&#12540;&#12473;</a>
2018-11-05 14:30:01.253638 TestArray[1322:320814] <a class=gb1 href="https://mail.google.com/mail/?tab=wm">Gmail</a>
2018-11-05 14:30:01.253750 TestArray[1322:320814] <a class=gb1 href="https://drive.google.com/?tab=wo">&#12489;&#12521;&#12452;&#12502;</a>
2018-11-05 14:30:01.253934 TestArray[1322:320814] <a class=gb1 style="text-decoration:none" href="https://www.google.co.jp/intl/ja/options/"><u>&#12418;&#12387;&#12392;&#35211;&#12427;</u> &raquo;</a>
2018-11-05 14:30:01.254049 TestArray[1322:320814] <a href="http://www.google.co.jp/history/optout?hl=ja" class=gb4>&#12454;&#12455;&#12502;&#23653;&#27508;</a>
2018-11-05 14:30:01.254164 TestArray[1322:320814] <a  href="/preferences?hl=ja" class=gb4>&#35373;&#23450;</a>
2018-11-05 14:30:01.254274 TestArray[1322:320814] <a target=_top id=gb_70 href="https://accounts.google.com/ServiceLogin?hl=ja&passive=true&continue=https://www.google.com/" class=gb4>&#12525;&#12464;&#12452;&#12531;</a>
2018-11-05 14:30:01.254434 TestArray[1322:320814] <a href="/advanced_search?hl=ja&amp;authuser=0">&#26908;&#32034;&#12458;&#12503;&#12471;&#12519;&#12531;</a>
2018-11-05 14:30:01.254739 TestArray[1322:320814] <a href="/language_tools?hl=ja&amp;authuser=0">&#35328;&#35486;&#12484;&#12540;&#12523;</a>
2018-11-05 14:30:01.254900 TestArray[1322:320814] <a href="https://www.google.com/setprefs?sig=0_hs-qGLtJFycvdIdXbi2jQdSOY4s%3D&amp;hl=en&amp;source=homepage&amp;sa=X&amp;ved=0ahUKEwi_tb7pwrzeAhULwLwKHZ9aDiAQ2ZgBCAU">English</a>
2018-11-05 14:30:01.255072 TestArray[1322:320814] <a href="/intl/ja/ads/">&#24195;&#21578;&#25522;&#36617;</a>
2018-11-05 14:30:01.255182 TestArray[1322:320814] <a href="http://www.google.co.jp/intl/ja/services/">&#12499;&#12472;&#12493;&#12473; &#12477;&#12522;&#12517;&#12540;&#12471;&#12519;&#12531;</a>
2018-11-05 14:30:01.255453 TestArray[1322:320814] <a href="https://plus.google.com/115899767381375908215" rel="publisher">+Google</a>
2018-11-05 14:30:01.255609 TestArray[1322:320814] <a href="/intl/ja/about.html">Google &#12395;&#12388;&#12356;&#12390;</a>
2018-11-05 14:30:01.255722 TestArray[1322:320814] <a href="https://www.google.com/setprefdomain?prefdom=JP&amp;prev=https://www.google.co.jp/&amp;sig=K_erqW_iZ2bjJu2TsKii5UfNnAGcg%3D">Google.co.jp</a>
2018-11-05 14:30:01.255832 TestArray[1322:320814] <a href="/intl/ja/policies/privacy/">&#12503;&#12521;&#12452;&#12496;&#12471;&#12540;</a>
2018-11-05 14:30:01.256001 TestArray[1322:320814] <a href="/intl/ja/policies/terms/">&#35215;&#32004;</a>
...