@"abc xyz http://www.example.com aaa bbb ccc"
のようなスペースで区切られた文字列があります。
部分文字列@"http://www.example.com"
を抽出するにはどうすればよいですか?
これが非常に遅い返信であることは知っていますが、次のコードでサブストリング「http://www.abc.com」を取得できます。
[@"abc xyz http://www.abc.com aaa bbb ccc" substringWithRange:NSMakeRange(8, 18)]
もちろん、そのためにNSString
を使用できます。
これを試して:
[yourString substringToIndex:<#(NSUInteger)#>];
//or
[yourString substringFromIndex:<#(NSUInteger)#>];
//or
[yourString substringWithRange:<#(NSRange)#>];
すべての部分文字列がスペースで区切られている場合、[myString componentsSeparatedByString:@" "]
を使用して部分文字列の配列を取得することができます。その後、[NSUrl URLWithString:yourSubstring]
の結果を確認できます。部分文字列が正しいリンクでない場合、nilを返します。
これがスクリプトの私のバージョンです...うまくいけば、きれいで簡単に実装できます。これは、制限に基づいて文字のサブストリングを実行します...
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
int maxLength = 100;
int currentLength = [self.messageField.text length];
if( currentLength > maxLength )
{
NSString *newMessageText = [self.messageField.text substringWithRange:NSMakeRange(0, maxLength)];
[self.messageField setText:newMessageText];
return NO;
}
else
{
return YES;
}
}
これにより、この問題を解決することもできます。
NSArray *data = [@"abc xyz http://www.abc.com aaa bbb ccc" componentsSeparatedByString:@" "];
for(NSString* str in data)
{
if([NSURLConnection canHandleRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:str]]])
NSLog(@"%@",[[NSString alloc ] initWithFormat:@"Found a URL: %@",str]);
}
それが役に立てば幸い!
PHPのsubstr()
は本当に便利だと思います。次のようなことができるようにしたい場合は、 NSString category をチェックしてください。
substr(@"abc xyz http://www.example.com aaa bbb ccc", 8,-12)
または
substr(@"abc xyz http://www.example.com aaa bbb ccc", 8, 18)
どちらもhttp://www.example.com
の結果を提供します
関連するコードのコピーを次に示します。
__attribute__((overloadable))
NSString *substr(NSString *str, int start)
{
return substr(str, start, 0);
}
__attribute__((overloadable))
NSString *substr(NSString *str, int start, int length)
{
NSInteger str_len = str.length;
if (!str_len) return @"";
if (str_len < length) return str;
if (start < 0 && length == 0)
{
return [str substringFromIndex:str_len+start];
}
if (start == 0 && length > 0)
{
return [str substringToIndex:length];
}
if (start < 0 && length > 0)
{
return [[str substringFromIndex:str_len+start] substringToIndex:length];
}
if (start > 0 && length > 0)
{
return [[str substringFromIndex:start] substringToIndex:length];
}
if (start > 0 && length == 0)
{
return [str substringFromIndex:start];
}
if (length < 0)
{
NSString *tmp_str;
if (start < 0)
{
tmp_str = [str substringFromIndex:str_len+start];
}
else
{
tmp_str = [str substringFromIndex:start];
}
NSInteger tmp_str_len = tmp_str.length;
if (tmp_str_len + length <= 0) return @"";
return [tmp_str substringToIndex:tmp_str_len+length];
}
return str;
}
可能な解決策は、正規表現を使用することです。 RegexKit を確認してください。
入力文字列に単純な保証がある場合(たとえば、文字列内のトークンが常にスペース文字で区切られるという保証)、スペース文字で分割し、接頭辞として@"http://"
の各要素をテストします。
NSString *input = @"abc xyz http://www.example.com aaa bbb ccc";
NSArray *parts = [input componentsSeparatedByString:@" "];
for (NSString *part in parts) {
if ([part hasPrefix:@"http://"]) {
// Found it!
}
}
これは、アプリケーションのニーズに基づいて最適化できます。たとえば、要素が見つかったらループを短絡するか、BlocksKitのフィルターを使用して、プレフィックスで始まる要素のみを取得します。理想的な解決策は、入力文字列の性質と、それを使って何を達成しようとしているかによって異なります。