0

学習目的でプロジェクトを作成しています:

情報のために:私は使用していませんUIWebView

私のプロジェクトでは、サーバーからHTMLデータ ( content ) を取得しました。このデータには、場所に関するすべての情報が含まれています ( Google マップから)。コンテンツから特定のデータを取得HTMLするには、 parse が必要HTMLです。HTMLを使用して解析しHppleます。また、HTML を正常に解析して特定のデータ (名前、住所など)を取得できましたが、コンテンツから緯度と経度を解析する必要HTMLがある場合、場所の緯度と経度を取得する方法について混乱しています。Javascript. つまり、これらの緯度と経度のデータはJavascript's 関数で利用できます。

サーバーから取得したJavascriptコンテンツ:( 私の制限は、このコードが非常に長いため、JavaScriptコードの一部しか配置できないということです)

function()
{
window.gHomeVPage=
{
   title:'Hostel, Bhavnagar, Gujarat, India - Google Maps',url:'/?q\\x3dHostel,+Bhavnagar,+Gujarat,+India\\x26hq\\x3dHostel,\\x26hnear\\x3dBhavnagar,+Gujarat,+India\\x26t\\x3dm\\x26ie\\x3dUTF8',urlViewport:false,ei:'jp8tUb3uNK2ciAeQroGACw',
  form:{
        selected:'q',
        q:{q:'Hostel, Bhavnagar, Gujarat, India',what:'Hostel,',near:'Bhavnagar, Gujarat, India'},d:{saddr:'',daddr:'',dfaddr:'Bhavnagar, Gujarat, India'},geocode:''},
        query:{type:'l'},viewport:{center:{lat:21.757528,lng:72.15303},span:{lat:0.034314,lng:0.039956},zoom:14,mapType:'m',source:0},modules:['','strr','pphover','act_s','appiw','rst'],
    overlays:{sxcar:false,
       markers:
           [{id:'A',cid:'7569356420090555589',latlng:{lat:21.747064,lng:72.169678},image:'http://maps.gstatic.com/intl/en_ALL/mapfiles/markers2/circleA.png',sprite:{width:20,height:34,top:0,image:'http://maps.gstatic.com/mapfiles/markers2/red_circle_markers_A_J2.png'},icon_id:'A',ext:{width:20,height:34,shadow:'http://maps.gstatic.com/intl/en_ALL/mapfiles/circle-shadow45.png',shadow_width:37,shadow_height:34,mask:false},drg:true,laddr:'Shree Sahajanand Girls Ptc Hostel, Ghogha Road, Bhavnagar, Gujarat 364001, India',geocode:'CfYWJFjKQj0mFXjVSwEdzjhNBCmN5-3pPlpfOTHF7NFVj8ELaQ',sxti:'Shree Sahajanand Girls Ptc Hostel',name:'Shree Sahajanand Girls Ptc Hostel',infoWindow:{title:'Shree Sahajanand Girls Ptc \\x3cb\\x3eHostel\\x3c/b\\x3e',addressLines:['Ghogha Road','Bhavnagar, Gujarat 364001, India'],phones:[{number:'0278 2562529'}],basics:'\\x3cdiv transclude\\x3d\\x22iw\\x22\\x3e\\x3c/div\\x3e',moreInfo:'more info',place_url:'http://maps.google.com/local_url?dq\\x3dHostel,+Bhavnagar,+Gujarat,+India\\x26q\\x3dhttps://plus.google.com/106028699675431268945/about%3Fhl%3Den\\x26s\\x3dANYYN7mCKtIBT1JPxwi6G2b9gVDdCuVyyA',zrvOk:true,loginUrl:'https://www.google.com/accounts/ServiceLogin?service\\x3dlocal\\x26hl\\x3den\\x26nui\\x3d1\\x26continue\\x3dhttp://maps.google.com/maps/place%3Fcid%3D7569356420090555589%26q%3DHostel,%2BBhavnagar,%2BGujarat,%2BIndia%26t%3Dm%26cd%3D1%26cad%3Dsrc:ppwrev%26ei%3Djp8tUb3uNK2ciAeQroGACw%26action%3Dopenratings',lbcurl:'http://www.google.com/local/add/choice?hl\\x3den\\x26gl\\x3dIN\\x26latlng\\x3d7569356420090555589\\x26q\\x3dHostel,\\x26near\\x3dBhavnagar,+Gujarat,+India',link_jsaction:''},ss:{edit:true,detailseditable:true,deleted:false,rapenabled:true,mmenabled:true},b_s:2,approx:true,elms:[4,1,6,2,12,1,9,1,5,2,11]
           }
}

上記のコードでは、値と値を取得lat:lon:たいlatlng:{lat:21.747064,lng:72.169678}

JavaScriptから取得するために、私はグーグルNSRegularExpressionで検索し、特定の一致(Data の)フォームコンテンツを取得するためにクラスを使用する必要があることを発見しました。

次に、次のコードで試しました

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?-imsx:latlng:)" options:NSRegularExpressionCaseInsensitive error:&error];

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

for (NSTextCheckingResult *match in arrayOfAllMatches)
{
        NSString* substringForMatch = [locationStr substringWithRange:match.range];
        NSLog(@"%@",substringForMatch);
}

次のような出力がコンソールに表示されました。

2013-02-28 11:35:25.051 MapExample[949:13d03] latlng:
2013-02-28 11:35:25.766 MapExample[949:13d03] latlng:
2013-02-28 11:35:26.208 MapExample[949:13d03] latlng:
2013-02-28 11:35:26.799 MapExample[949:13d03] latlng:
2013-02-28 11:35:27.303 MapExample[949:13d03] latlng:
2013-02-28 11:35:27.722 MapExample[949:13d03] latlng:

から検索されたノードのコンテンツを取得するにはどうすればよいNSRegularExpressionですか?

4

2 に答える 2

3

本当に正規表現を使用したい場合は、次のパターンが機能するはずです。

NSString *pattern = @"latlng:\\{lat:([0-9.]+),lng:([0-9.]+)\\}";

[0-9.]+は数字または である 1 つ以上の文字に一致.し、その周りの括弧はそれを「キャプチャ グループ」にするため、パターンのこの部分に一致する文字列の部分は を使用して使用できますrangeAtIndex:

これを確認するために、質問からの正確な入力データをリソースファイル「data.txt」としてテストアプリケーションに追加し、そのデータを次のようにロードしました

NSURL *url = [[NSBundle mainBundle] URLForResource:@"data.txt" withExtension:nil];
NSError *error;
NSString *locationStr = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];

次に、正規表現で文字列を解析しました

NSString *pattern = @"latlng:\\{lat:([0-9.]+),lng:([0-9.]+)\\}";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];

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

for (NSTextCheckingResult *match in matches)
{
    NSString *lat = [locationStr substringWithRange:[match rangeAtIndex:1]];
    NSString *lng = [locationStr substringWithRange:[match rangeAtIndex:2]];
    NSLog(@"latidude = %@, longitude = %@", lat, lng);
}

出力:

latidude = 21.747064, longitude = 72.169678
于 2013-03-02T04:24:10.410 に答える
0

あなたの質問に対する直接的な回答ではありませんが、実際には UIWebView を使用してこれを行う簡単な方法があります。

+(NSString *)valueFromJSON:(NSString *)json andKey:(NSString *)key {
    UIWebView webView = [[UIWebView alloc] init];
    return [webView stringByEvaluatingJavaScriptFromString:[NSString withFormat:@"(function(){ var v = %@; return var.%@; }())", json, key]];
}

Mac を使用しておらず、かなり遅れているために常に発生する構文エラーについては、前もってお詫び申し上げます。このコードを繰り返し呼び出す場合は、毎回新しい WebView を初期化しない方が賢明な場合があります。これは、WebKit の Javascript エンジンの機能を利用して、簡単な JSON 解析を行います。データ構造に合わせて Javascript 関数の戻り値を置き換えます。

于 2013-02-28T07:02:32.837 に答える