Tengo una secuencia separada del espacio como @"abc xyz http://www.example.com aaa bbb ccc"
.Objective-C: ¿La mejor forma de extraer subcadenas de NSString?
¿Cómo puedo extraer la subcadena @"http://www.example.com"
de ella?
Tengo una secuencia separada del espacio como @"abc xyz http://www.example.com aaa bbb ccc"
.Objective-C: ¿La mejor forma de extraer subcadenas de NSString?
¿Cómo puedo extraer la subcadena @"http://www.example.com"
de ella?
Si todas sus subcadenas están separadas por espacios, puede intentar obtener una matriz de subcadenas usando [myString componentsSeparatedByString:@" "]
. Luego puede verificar el resultado de [NSUrl URLWithString:yourSubstring]
. Devolverá nil si la subcadena no es un enlace correcto.
Una posible solución podría ser el uso de expresiones regulares. Consulte RegexKit.
Regexp es casi siempre la solución incorrecta. La coincidencia especial de URL es muy difícil ya que la expresión regular correcta es muy larga. La correspondencia de las direcciones de correo electrónico, por ejemplo, es difícil: http://www.regular-expressions.info/email.html –
Point well taken. –
"Algunas personas, cuando se enfrentan con un problema, piensan" Lo sé, usaré expresiones regulares ". Ahora tienen dos problemas". http://regex.info/blog/2006-09-15/247 –
Sé que esto es una respuesta muy tarde, pero se puede obtener la subcadena "http://www.abc.com" con el siguiente código:
[@"abc xyz http://www.abc.com aaa bbb ccc" substringWithRange:NSMakeRange(8, 18)]
Por supuesto, todavía se puede utilizar una NSString
para eso.
Prueba esto:
[yourString substringToIndex:<#(NSUInteger)#>];
//or
[yourString substringFromIndex:<#(NSUInteger)#>];
//or
[yourString substringWithRange:<#(NSRange)#>];
Esto también puede tratar de resolver este problema:
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]);
}
espero que ayude!
Encuentro PHP substr()
realmente conveniente. Mira mi NSString category si usted está mirando para ser capaz de hacer algo como esto:
substr(@"abc xyz http://www.example.com aaa bbb ccc", 8,-12)
o
substr(@"abc xyz http://www.example.com aaa bbb ccc", 8, 18)
Ambos le dé el resultado de http://www.example.com
Aquí es una copia de la pieza relevante de código:
__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;
}
Aquí está mi versión del guión ... Hopefu Simplemente es limpio y fácil de implementar. Se hace un substr de los personajes basados en los límites ... La mía se utiliza para un área de texto, pero es evidente que se puede adaptar a campos de texto :)
-(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;
}
}
Si su cadena de entrada tiene garantiza simples (por ejemplo, la garantía de que los tokens en la cadena siempre están delineados por un carácter de espacio) luego se divide en el carácter de espacio y prueba cada elemento para @"http://"
como un prefijo.
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!
}
}
Esto se puede optimizar en función de las necesidades de la aplicación; por ejemplo, elija cortocircuitar el bucle una vez que se encuentre el elemento o use filtros en BlocksKit para obtener solo elementos que comiencen con el prefijo. Una solución ideal dependerá de la naturaleza de la cadena de entrada y de lo que intenta lograr con ella.
Tal vez me malinterpretaste o quizás te malentendí, pero http://www.abc.com es solo un ejemplo. Lo que quiero decir es cómo obtener una subcadena con formato de un enlace de URL desde NSString. Esperando su respuesta – ThyPhuong
Hmm ... NSArray * subStrings = [yourString componentsSeparatedByString: @ ""]; para (NSString * subString en subStrings) { if ([NSUrl URLWithString: subString]) { NSLog (@ "Esta subcadena es una URL:% @", subString); } } – Morion
Si sus subcadenas están separadas por @ "", verá en la consola todas las subcadenas, que son las URL correctas. – Morion