【问题标题】:Regex - remove the last <p> segment of an HTML string正则表达式 - 删除 HTML 字符串的最后一个 <p> 段
【发布时间】:2011-09-03 14:54:47
【问题描述】:

我有一个从 RSS 提要中提取的 HTML 结构,我需要删除它的一部分,但它不是流的独立部分。

所以我有

<p>Some Html... </p>
<br />
<p>The p section I want to remove</p>

有没有可以做到这一点的正则表达式模式?找到给定字符串的最后一个&lt;p&gt; 段并将其切掉?我将 C# 用于正则表达式。

【问题讨论】:

标签: c# regex html-parsing


【解决方案1】:

您确定要为此使用正则表达式吗?其实我认为你应该只在需要的时候使用它们。

你为什么不考虑类似的东西(假设 HTML 格式正确并且没有嵌套段落):

string html = GetRSS();
int pStartIndex = html.LastIndexOf("<p>");
int pEndIndex = html.LastIndexOf("</p>");
string result = html.Remove(pStartIndex, pEndIndex - pStartIndex + 4);

或者,您可以考虑使用更高级(并且可能更合适)的东西,例如 HTML Agility Pack 或(如果您使用格式不正确的 html,则更糟)集成的 .NET XML 解析器(编辑: 正如 svicks 所说,如果您选择此解决方案,请确保您使用的 HTML 也是有效的 XML)。

【讨论】:

  • XML 解析器即使使用格式良好且有效的 HTML 也无济于事。 HTML 不是 XML。
  • 我同意你的观点,但我刚刚向他展示了他如何面对这个问题。实际上,我认为在这种情况下没有正确的解决方案,即使当您说 HTML 不是 XML 时您是对的,在他的情况下,XML 解析器可能工作得很好。我无法忍受按照假设工作,如果它符合我的要求并且不会导致我遇到其他奇怪的问题,我更愿意使用它。
  • 但这正是使用 XML 解析器处理 HTML 将导致您的问题——稍后会出现一些奇怪的问题。如果您真的在使用 HTML(而不是 XHTML)并且您不能完全确定 HTML 也是有效的 XML,那么您不应该使用 XML 解析器来处理它。
  • 我明白了,但我想当然地认为他已经知道他正在使用哪种代码。我会更新我的答案,谢谢:)
  • 是的,这非常有效。是的,我想为此使用正则表达式。这是一个简单的项目,它不会在线超过几个月。我只需要让它暂时起作用。
【解决方案2】:

您可以使用此正则表达式替换最后一次出现的 &lt;p&gt; 标记。

// Begin with '<p>' followed by any character and then end with '</p>'
var pattern = @"<p>.*</p>"; 
var regex = new Regex(pattern);

var sourceString = @"<p>Some Html... </p>\n<br />\n<p>The p section I want to remove</p>";

var matchCollection = regex.Matches(sourceString);
if(matchCollection.Count > 0)
{
    sourceString.Replace(matchCollection[matchCollection.Count - 1].Value, string.Empty);
}

【讨论】:

    猜你喜欢
    • 2013-04-28
    • 1970-01-01
    • 2019-03-21
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 2012-07-03
    相关资源
    最近更新 更多