Заменить текст, если он не находится внутри определенных указанных тегов HTML - PullRequest
2 голосов
/ 07 июня 2009

У меня есть список слов, которые следует заменить на HTML-страница, но только если слово не входит в список тегов (например, A B I)

Итак, если есть текст:

<p> some text and XXX term <a href="http://some-XXX-bla.com">good morning XXX world</a> other text and XXX term <b>another XXX inside other sentance</b> </p>

и XXX следует заменить на YYY, а окончательный текст должен быть:

<p> some text and YYY term <a href="http://some-XXX-bla.com">good morning XXX world</a> other text and YYY term <b>another XXX inside other sentance</b> </p>

YYY заменил XXX, только если XXX не было в списке запрещенных тегов (A, I, B)

Должно быть как-то сделано в C # регулярное выражение

Большое спасибо за помощь:)

Ответы [ 2 ]

7 голосов
/ 07 июня 2009

Это было сказано много раз, но я также могу повторить это здесь ... Вы действительно не хотите использовать регулярные выражения для разбора HTML. Он просто не подходит для сложностей HTML (его lot сложнее разобрать с регулярным выражением, чем может показаться на первый взгляд).

Лучшим вариантом для .NET является HTML Agility Pack , представляющий собой очень надежную библиотеку, которая может правильно анализировать любую форму HTML-супа. Это также намного легче манипулировать, так как это предоставляет структуру DOM. Это позволит вам просто пройти DOM и легко проверить родительские / родительские узлы, чтобы можно было выполнить замены, изменив свойство InnerText соответствующего элемента. Когда вы все закончите, это простой вызов для вывода необработанного HTML-кода из модифицированного объекта DOM.

3 голосов
/ 07 июня 2009

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

public string GetReplacement(Match m) {
    return m.Groups[1].Success ? m.Groups[1].Value : "YYY";
}

Regex r = new Regex( @"(?is)(<([abi]\b)[^<>]*>.*?</\2>)|XXX" );
string newString = r.Replace(oldString,
                   new MatchEvaluator(GetReplacement));

Но имейте в виду, что существует много обстоятельств, когда этот код не работает, даже в допустимом (X) HTML. Например, элемент может быть вложен в другой элемент того же вида, например:

<i>blah <i>blah</i> XXX</i>

Или начальный или конечный тег внутри комментария может сбить вас с толку:

<b>blah <!-- </b> --> XXX</b>

Вы можете справиться со многими потенциальными проблемами, усложнив регулярное выражение и код MatchEvaluator, но в конечном итоге вам придется либо принять несколько недостатков, либо переключиться на выделенный анализатор HTML, как рекомендованный Нолдорин.

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