Regex, чтобы найти строку, содержащуюся между тегами HTML - PullRequest
0 голосов
/ 07 декабря 2011

Моя проблема - найти позицию определенного слова (например: span ) в строке NSSt, содержащей текст HTML, и заменить это слово.

Например, если мое целевое слово span , мой текст замены должен выглядеть следующим образом:

<SPAN style="BACKGROUND-COLOR: #FF0000">span</SPAN>

Если мой начальный текст:

<span class='i_04_12_000000'>this is a span</span>

Мой желаемый результат будет:

<span class='i_04_12_000000'>this is a <SPAN style="BACKGROUND-COLOR: #FF0000">span</SPAN></span>

Очевидно, что если я просто найду span , я не найду только вхождение в теге html. Идеи о том, как найти правильную строку, даже с NSRange?

UPDATE:

Это окончательное решение:;)

    +(NSString *)emphasizeString:(NSString *)stringToEmphasize inText:(NSString *)fullText
{
    NSString * regExp = [NSString stringWithFormat:@"(?i)([\\s\\.,>'-])(%@)([\\s\\.,;!\\?\\)<])",stringToEmphasize];;
    NSArray * regexResult = [fullText arrayOfCaptureComponentsMatchedByRegex:regExp];
    NSString * result = [NSString stringWithString:fullText];
    if([regexResult count] >0)
    {
        for (NSArray * match in regexResult)
        {

            NSString * all = [match objectAtIndex:0];
            NSString * before = [match objectAtIndex:1];
            NSString * matched = [match objectAtIndex:2];
            NSString * after = [match objectAtIndex:3];

            result = [result stringByReplacingOccurrencesOfString:all 
                                                       withString:[NSString stringWithFormat:@"%@<SPAN style=\"BACKGROUND-COLOR: #FF0000\">%@</SPAN>%@",before, matched, after]
                                                          options:NSCaseInsensitiveSearch 
                                                            range: [result rangeOfString:all]];
        }
    }
    NSLog(@"%@",result);
    return result;
}

Ответы [ 2 ]

1 голос
/ 03 января 2012

Это окончательное решение:;)

    +(NSString *)emphasizeString:(NSString *)stringToEmphasize inText:(NSString *)fullText
{
    NSString * regExp = [NSString stringWithFormat:@"(?i)([\\s\\.,>'-])(%@)([\\s\\.,;!\\?\\)<])",stringToEmphasize];;
    NSArray * regexResult = [fullText arrayOfCaptureComponentsMatchedByRegex:regExp];
    NSString * result = [NSString stringWithString:fullText];
    if([regexResult count] >0)
    {
        for (NSArray * match in regexResult)
        {

            NSString * all = [match objectAtIndex:0];
            NSString * before = [match objectAtIndex:1];
            NSString * matched = [match objectAtIndex:2];
            NSString * after = [match objectAtIndex:3];

            result = [result stringByReplacingOccurrencesOfString:all 
                                                       withString:[NSString stringWithFormat:@"%@<SPAN style=\"BACKGROUND-COLOR: #FF0000\">%@</SPAN>%@",before, matched, after]
                                                          options:NSCaseInsensitiveSearch 
                                                            range: [result rangeOfString:all]];
        }
    }
    NSLog(@"%@",result);
    return result;
}
0 голосов
/ 07 декабря 2011

Попробуйте следующее регулярное выражение: /<[a-z]+.*?>/

РЕДАКТИРОВАТЬ: обновить в соответствии с вашими новыми инструкциями:

Поскольку тег HTML, предшествующий тексту, который вы хотите захватить, имеет переменное количество символовВы не можете использовать lookbehind для захвата только целевого слова, которому предшествует открывающий тег.Однако вы можете использовать:

/(<)([a-z]+)(.*?>.*?)(\2)(.*?</\1>)/

, чтобы захватить весь тег, где имя тега повторяется где-то в его тексте, и изолировать этот фрагмент текста в группе захвата.Затем используйте метод замены, чтобы использовать это регулярное выражение в качестве шаблона поиска, и "$1$2$3<span style=\"background-color: #FF0000;\">$4</span>$5" (где $ 4 обозначает четвертую группу захвата, содержащую наш целевой текст) для строки замены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...