我在c#中有一个变量,持有像这样的字符串
string myText="my text which contains <div>i am text inside div</div>";
现在我想用\n
替换所有“"<br>"
”(换行符号)此变量的数据,除了div中的文本。
我该怎么做?
答案 0 :(得分:2)
对于类似这样的事情,您需要解析HTML,以便区分您想要替换的部分和不需要替换的部分。
我建议查看HTML agility pack - 它可以解析HTML片段以及格式错误的HTML。然后,您可以使用XPath表示法查询生成的解析树,并在所选节点上进行替换。
答案 1 :(得分:2)
其他人建议使用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 :(得分:1)
这需要一些相当复杂的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重新组装部件。
答案 3 :(得分:0)
我会在div上拆分字符串,然后查看令牌,如果它以“div”开头,那么如果它以div开头则不要用BR替换\ n然后你需要找到结束div并拆分它。然后拿第二个令牌做你刚刚做的...当然,因为你将不得不将令牌附加到一个主字符串......我会在几分钟内编写一个样本......
答案 4 :(得分:-1)
使用string.Replace()方法,如下所示:
myText = myText.Replace("\n", "<br>")
您可以考虑使用Environment.NewLine属性来查找换行符。你确定它们不是\ n \ r或\ r \ n等...
如果您不想解析,可能必须先将div中的文本拉出来。使用正则表达式找到它并删除它,然后执行上面的Replace(),然后将字符串放回去。