заменить регулярное выражение - но с несколькими исключениями - PullRequest
0 голосов
/ 11 марта 2010

У меня есть строка, содержащая HTML, и мне нужно заменить некоторые слова ссылками - я делаю это с помощью следующего кода;

string lNewHTML = Regex.Replace(lOldHTML, "(\bword1\b|\bword2|word3\b)", "<a href=\"page.aspx#$1\">$1</a>", RegexOptions.IgnoreCase);

Код работает, но мне нужно включить некоторые исключения для замены - например, Я не буду ничего заменять в тегах img, li и a (включая текст ссылки и такие атрибуты, как href и title), но все же разрешать замены в тегах p, td и div.

Кто-нибудь может понять это?

Ответы [ 2 ]

1 голос
/ 11 марта 2010

Хорошо, после некоторого времени попыток построить подходящее регулярное выражение, вот моя попытка .. Это может потребовать дополнительной работы, но должно указать вам правильное направление.

Я сопоставляю слова "word1" и "word2", а не внутри тега "tag1" или "tag2". Конечно, вам нужно настроить это под свои нужды. Включите RegexOptions.IgnorePatternWhitespace, если хотите сохранить мое форматирование.

К сожалению, я придумала регулярное выражение, которое вы могли бы просто подключить к Regex.Replace, так как это регулярное выражение будет соответствовать всей строке после предыдущего совпадения, но слово, которое вас интересует, находится в первой группе. Эта группа содержит индекс и длину слова, поэтому вы можете легко заменить его, используя String.Substring ...

(?:
    \G
    (?:
        (?>
             <tag1(?<N>)
            |<tag2(?<N>)
            |</tag1(?<-N>)
            |</tag2(?<-N>)
            |.)*?
        (?(N)(?!))
    )*
 )
(word1|word2)
1 голос
/ 11 марта 2010

Необходимо использовать перегрузку Replace с параметром MatchEvaluator, чтобы вы проверяли каждое совпадение и решали, заменять или нет.

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