iPhone Цель C - Как удалить URL-адреса из строки NSString - PullRequest
1 голос
/ 10 марта 2011

Я ищу эффективный способ замены URL-адресов в NSString (или NSMutableString) словом замены 'link', например ...

@"This is a sample with **http://bitbanter.com** within the string and heres another **http://spikyorange.co.uk** for luck"

Я бы хотел, чтобы это стало ...

@"This is a sample with **'link'** within the string and heres another **'link'** for luck"

В идеале я хотел бы, чтобы это был какой-то метод, который принимает регулярные выражения, но это должно работать на iPhone, желательно без каких-либо библиотек, или, я мог бы убедить, еслибиблиотека была крошечной.

Другие функции, которые были бы удобны, замените @"OMG" на @"Oh my God", но не когда это часть слова, то есть @"DOOMGAME" не следует трогать.

Любые предложения приветствуются.

С уважением, Роб.

Ответы [ 2 ]

3 голосов
/ 10 марта 2011

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

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

- (NSString*)replacePattern:(NSString*)pattern withReplacement:(NSString*)replacement forString:(NSString*)string usingCharacterSet:(NSCharacterSet*)characterSetOrNil
{
    // Check if a NSCharacterSet has been provided, otherwise use our "default" one
    if (!characterSetOrNil)
    characterSetOrNil = [NSCharacterSet characterSetWithCharactersInString:@" !?,()]"];

    // Create a mutable copy of the string supplied, setup all the default variables we'll need to use
    NSMutableString *mutableString = [[[NSMutableString alloc] initWithString:string] autorelease];
    NSString *beforePatternString = nil;
    NSRange outputrange = NSMakeRange(0, 0);

    // Check if the string contains the "pattern" you're looking for, otherwise simply return it.
    NSRange containsPattern = [mutableString rangeOfString:pattern];
    while (containsPattern.location != NSNotFound)
    // Found the pattern, let's run with the changes
    {
        // Firstly, we grab the full string range
        NSRange stringrange = NSMakeRange(0, [mutableString length]);
        NSScanner *scanner = [[NSScanner alloc] initWithString:mutableString];

        // Now we use NSScanner to scan UP TO the pattern provided
        [scanner scanUpToString:pattern intoString:&beforePatternString];

        // Check for nil here otherwise you will crash - you will get nil if the pattern is at the very beginning of the string
        // outputrange represents the range of the string right BEFORE your pattern
        // We need this to know where to start searching for our characterset (i.e. end of output range = beginning of our pattern)
        if (beforePatternString != nil)
            outputrange = [mutableString rangeOfString:beforePatternString];

        // Search for any of the character sets supplied to know where to stop.
        // i.e. for a URL you'd be looking at non-URL friendly characters, including spaces (this may need a bit more research for an exhaustive list)
        NSRange characterAfterPatternRange = [mutableString rangeOfCharacterFromSet:characterSetOrNil options:NSLiteralSearch range:NSMakeRange(outputrange.length, stringrange.length-outputrange.length)];

        // Check if the link is not at the very end of the string, in which case there will be no characters AFTER it so set the NSRage location to the end of the string (== it's length)
        if (characterAfterPatternRange.location == NSNotFound)
            characterAfterPatternRange.location = [mutableString length];

        // Assign the pattern's start position and length, and then replace it with the pattern
        NSInteger patternStartPosition = outputrange.length;
        NSInteger patternLength = characterAfterPatternRange.location - outputrange.length;
        [mutableString replaceCharactersInRange:NSMakeRange(patternStartPosition, patternLength) withString:replacement];
        [scanner release];

        // Reset containsPattern for new mutablestring and let the loop continue
        containsPattern = [mutableString rangeOfString:pattern];
    }
    return [[mutableString copy] autorelease];
}

И чтобы использовать ваш вопрос в качестве примера, вот как вы можете его назвать:1008 * Надеюсь, это поможет!Ура, Рог

0 голосов
/ 10 марта 2011

Начиная с iOS 4, доступно NSRegularExpression . Помимо прочего, вы можете перечислять все совпадения в строке через блок, что позволяет вам делать с ними все, что вы хотите, или же регулярное выражение выполняет некоторые виды подстановки непосредственно для вас.

Прямые подстановки строк (например, «OMG» -> «Боже мой») могут выполняться напрямую с помощью строки NSString, используя -stringByReplacingOccurencesOfString: withString: или replaceOccurferencesOfString: withString: options: диапазон: , если ваша строка изменчива.

...