我的Objective-C程序使用正则表达式获取整个HTML,但有时会出现异常
这是关于Objective-C的问题。我编写了一个程序,它使用正则表达式获取整个HTML。我已经将程序上传到GitHub。但是,出现异常 本程序的目的是通过正则表达式匹配得到“og:image”。这是通过在Facebook中写入URL显示的图像。要设置此图像,请使用HTML编写,如下所示:我的Objective-C程序使用正则表达式获取整个HTML,但有时会出现异常,objective-c,regex,facebook,html-parsing,Objective C,Regex,Facebook,Html Parsing,这是关于Objective-C的问题。我编写了一个程序,它使用正则表达式获取整个HTML。我已经将程序上传到GitHub。但是,出现异常 本程序的目的是通过正则表达式匹配得到“og:image”。这是通过在Facebook中写入URL显示的图像。要设置此图像,请使用HTML编写,如下所示: <meta property="og:image" content="http://business.nikkeibp.co.jp/article/NBD/20120727/235043/zu1.jpg
<meta property="og:image"
content="http://business.nikkeibp.co.jp/article/NBD/20120727/235043/zu1.jpg">
所以我写了一个程序,可以得到整个HTML并找到og:image部分。代码如下:
// Web page address
NSURL *url = [NSURL URLWithString:textField.text];
// Get the web page HTML
NSString *string =
[NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
// prepare regular expression to find text
NSError *error = nil;
NSRegularExpression *regexp =
[NSRegularExpression regularExpressionWithPattern:
@"<meta property=\"og:image\" content=\".+\""
options:0
error:&error];
@try {
// find by regular expression
NSTextCheckingResult *match =
[regexp firstMatchInString:string options:0 range:NSMakeRange(0, string.length)];
// get the first result
NSRange resultRange = [match rangeAtIndex:0];
NSLog(@"match=%@", [string substringWithRange:resultRange]);
if (match) {
// get the og:image URL from the find result
NSRange urlRange = NSMakeRange(resultRange.location + 35, resultRange.length - 35 - 1);
NSURL *urlOgImage = [NSURL URLWithString:[string substringWithRange:urlRange]];
imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:urlOgImage]];
}
}
//网页地址
NSURL*url=[NSURL URLWithString:textField.text];
//获取网页HTML
NSString*字符串=
[NSString stringWithContentsOfURL:url编码:NSUTF8StringEncoding错误:无];
//准备正则表达式以查找文本
n错误*错误=nil;
NSRegularExpression*regexp=
[NSRegularExpression regular expression with pattern:
@“看起来您的正则表达式与第二个页面的结果不匹配,您是否在正则表达式测试仪中使用正则表达式测试了该页面的html源代码
类似这样的操作应该可以解决问题:看起来正则表达式与第二个页面的结果不匹配,您是否在正则表达式测试仪中使用正则表达式测试了该页面的html源代码
类似这样的东西应该可以做到这一点:我的朋友善意地指出要考虑字符编码。第一个URL页面的字符编码是UTF-8,第二个是EUC-JP
使用下面的代码,我可以得到上面显示的第二个URL的og:image
- (NSString *)encodedStringWithContentsOfURL:(NSURL *)url
{
// Get the web page HTML
NSData *data = [NSData dataWithContentsOfURL:url];
// response
int enc_arr[] = {
NSUTF8StringEncoding, // UTF-8
NSShiftJISStringEncoding, // Shift_JIS
NSJapaneseEUCStringEncoding, // EUC-JP
NSISO2022JPStringEncoding, // JIS
NSUnicodeStringEncoding, // Unicode
NSASCIIStringEncoding // ASCII
};
NSString *data_str = nil;
int max = sizeof(enc_arr) / sizeof(enc_arr[0]);
for (int i=0; i<max; i++) {
data_str = [
[NSString alloc]
initWithData : data
encoding : enc_arr[i]
];
if (data_str!=nil) {
break;
}
}
return data_str;
}
-(NSString*)encodedStringWithContentsOfURL:(NSURL*)url
{
//获取网页HTML
NSData*data=[NSData dataWithContentsOfURL:url];
//回应
int enc_arr[]={
NSUTF8StringEncoding,//UTF-8
NSShiftJISStringEncoding,//Shift\u JIS
NSJapaneseEUCStringEncoding,//EUC-JP
NSISO2022JPStringEncoding,//JIS
NSU编码,//Unicode
NSASCIIStringEncoding//ASCII
};
NSString*data_str=nil;
int max=sizeof(enc_arr)/sizeof(enc_arr[0]);
对于(inti=0;i我的朋友善意地指出了考虑字符编码的问题。第一个URL页面的字符编码是UTF-8,第二个是EUC-JP
使用下面的代码,我可以得到上面显示的第二个URL的og:image
- (NSString *)encodedStringWithContentsOfURL:(NSURL *)url
{
// Get the web page HTML
NSData *data = [NSData dataWithContentsOfURL:url];
// response
int enc_arr[] = {
NSUTF8StringEncoding, // UTF-8
NSShiftJISStringEncoding, // Shift_JIS
NSJapaneseEUCStringEncoding, // EUC-JP
NSISO2022JPStringEncoding, // JIS
NSUnicodeStringEncoding, // Unicode
NSASCIIStringEncoding // ASCII
};
NSString *data_str = nil;
int max = sizeof(enc_arr) / sizeof(enc_arr[0]);
for (int i=0; i<max; i++) {
data_str = [
[NSString alloc]
initWithData : data
encoding : enc_arr[i]
];
if (data_str!=nil) {
break;
}
}
return data_str;
}
-(NSString*)encodedStringWithContentsOfURL:(NSURL*)url
{
//获取网页HTML
NSData*data=[NSData dataWithContentsOfURL:url];
//回应
int enc_arr[]={
NSUTF8StringEncoding,//UTF-8
NSShiftJISStringEncoding,//Shift\u JIS
NSJapaneseEUCStringEncoding,//EUC-JP
NSISO2022JPStringEncoding,//JIS
NSU编码,//Unicode
NSASCIIStringEncoding//ASCII
};
NSString*data_str=nil;
int max=sizeof(enc_arr)/sizeof(enc_arr[0]);
对于(int i=0;我感谢您的建议。很抱歉,我在测试工具之前解决了我的问题,但我认为这是一个有用的工具。感谢您的建议。很抱歉,我在测试工具之前解决了我的问题,但我认为这是一个有用的工具。