форматирование HTML в C # - PullRequest
1 голос
/ 20 февраля 2011

у меня есть переменная в c #, содержащая некоторую строку, подобную этой

string myText="my text  which contains <div>i am text inside div</div>";

Теперь я хочу заменить все "\n" (символ новой строки) на "<br>" для данных этой переменной, крометекст внутри div.

Как мне это сделать?

Ответы [ 5 ]

2 голосов
/ 20 февраля 2011

Другие предложили использовать библиотеки, такие как HTMLAgilityPack.Первый действительно хороший инструмент, но если вам не нужны функции парсинга HTML сверх того, что вы запрашивали, то достаточно простого парсера:

    string ReplaceNewLinesWithBrIfNotInsideDiv(string input) {

        int divNestingLevel = 0;
        StringBuilder output = new StringBuilder();
        StringComparison comp = StringComparison.InvariantCultureIgnoreCase;

        for (int i = 0; i < input.Length; i++) {
            if (input[i] == '<') {
                if (i < (input.Length - 3) && input.Substring(i, 4).Equals("<div", comp)){
                    divNestingLevel++;
                } else if (divNestingLevel != 0 && i < (input.Length - 5) && input.Substring(i, 6).Equals("</div>", comp)) {
                    divNestingLevel--;
                }
            }

            if (input[i] == '\n' && divNestingLevel == 0) {
                output.Append("<br/>");
            } else {
                output.Append(input[i]);
            }
        }

        return output.ToString();
    }

Это также должно обрабатывать вложенные div.

2 голосов
/ 20 февраля 2011

Для чего-то подобного вам нужно будет проанализировать HTML, чтобы отличить те части, в которых вы хотите произвести замену, от тех, которые вы не делаете.

Я предлагаю посмотреть на HTML agility pack - он может анализировать как фрагменты HTML, так и неверно сформированный HTML.Затем вы можете запросить результирующее дерево разбора, используя нотацию XPath, и выполнить замену на выбранных узлах.

1 голос
/ 20 февраля 2011

Для этого потребуется довольно сложный RegEx, вне моей лиги.

Но вы можете попробовать разбить строку:

string[] parts = myText.Split("<div>", "</div>");

for (int i = 0; i < parts.Length; i += 2)  // only the even parts
  parts[i] = string.Replace(...);

А затем используйте StringBuilder для повторной сборки деталей.

0 голосов
/ 20 февраля 2011

Я бы разделил строку на div, затем посмотрел бы на токены, если они начинаются с "div", и не заменял бы \ n на BR, если он действительно начинается с div, тогда вам нужно найти закрывающий div и разбить на него.затем возьмите 2-й токен и сделайте то, что вы только что сделали ... конечно, так как вам придется добавлять токены в основную строку ... я напишу здесь пример через несколько минут ...

0 голосов
/ 20 февраля 2011

Используйте метод string.Replace () следующим образом:

 myText = myText.Replace("\n", "<br>")

Вы можете использовать свойство Environment.NewLine для поиска символов новой строки. Вы уверены, что они не \ n \ r или \ r \ n и т. Д ...

Возможно, вам придется сначала извлечь текст внутри div, если вы не хотите его анализировать. Используйте регулярное выражение, чтобы найти и удалить его, затем выполните Replace (), как указано выше, затем поместите строки обратно.

...