我有一個結構如下的 html 代碼:
<html>
<body>
...
<p class="class1">
Text
Some more text
Even more text
</p>
...
<p class="class2">
Bla
Bla
Read more at
<a href="..." >Link</a>
</p>
</html>
如何用C#替換<p>標簽之間的所有換行符?<br />所有其他標簽不應匹配。
這就是我目前擁有的正則運算式。但它并沒有像我期望的那樣作業。
/(?<=<p).*(\n).*(?=<\/p>)/gs
uj5u.com熱心網友回復:
問題是洗掉其他兩段文本之間的一段文本可以通過以下方式在 C# 中使用正則運算式解決:
var start = @"<p[\s>]";
var end = @"</p>";
var pattern = $@"(?s){start}.*?{end}";
var result = Regex.Replace(text, pattern, m =>
m.Value.Replace("\n", "<br />"));
在這里,(?s)<p[\s>].*?</p>將找到<p(后跟空格或>) 和之間的所有子字串</p>,然后將匹配值中的m => m.Value.Replace("\n", "<br />")LF 符號替換為。<br />
如果換行符可以混合,您將需要使用另一個Regex.Replace呼叫,并將替換m.Value.Replace("\n", "<br />")為
Regex.Replace(m.Value, "\r\n?|\n", "<br />")
或者,如果您打算將連續換行符縮小為一個<br />:
Regex.Replace(m.Value, "(?:\r\n?|\n) ", "<br />")
uj5u.com熱心網友回復:
您不應該使用 regex 決議 HTML。而是使用 HTML 決議器庫,例如HtmlAgilityPack:
string html = @"
<html>
<body>
...
<p class1"" >
Text
Some more text
Even more text
</p >
...
<p class2"" >
Bla
Bla
Read more at
<a href=""..."" > Link</a>
</p>
</body>
</html>";
HtmlDocument doc = new();
doc.LoadHtml(html);
var allParagraphs = doc.DocumentNode.SelectNodes( "//p//text()").Cast<HtmlTextNode>().ToList();
allParagraphs.ForEach(p => p.Text = p.Text.Replace(Environment.NewLine, "<br />"));
html = doc.DocumentNode.OuterHtml;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/531330.html
標籤:C#正则表达式
