Dan*_*ner 149
如前所述,您不应使用正则表达式来处理XML或HTML文档.它们在HTML和XML文档中表现不佳,因为无法以一般方式表达嵌套结构.
您可以使用以下内容.
String result = Regex.Replace(htmlDocument, @"<[^>]*>", String.Empty);
Run Code Online (Sandbox Code Playgroud)
这适用于大多数情况,但有些情况(例如CDATA包含尖括号),这将无法按预期工作.
Jas*_*rue 78
正确的答案是不要那样做,使用HTML Agility Pack.
编辑添加:
为了无耻地从jesse的下面的评论中窃取,并且为了避免被指责在这段时间之后没有充分回答这个问题,这里有一个简单,可靠的片段,使用HTML Agility Pack,即使是最不完美的,形式多变的HTML:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(Properties.Resources.HtmlContents);
var text = doc.DocumentNode.SelectNodes("//body//text()").Select(node => node.InnerText);
StringBuilder output = new StringBuilder();
foreach (string line in text)
{
output.AppendLine(line);
}
string textOnly = HttpUtility.HtmlDecode(output.ToString());
Run Code Online (Sandbox Code Playgroud)
使用正则表达式解析HTML几乎没有什么可辩护的案例,因为即使在非传统的正则表达式引擎中,如果没有上下文感知也无法正确解析HTML.您可以通过RegEx获得部分途径,但您需要进行人工验证.
Html Agility Pack可以为您提供一个强大的解决方案,可以减少手动修复由于天真地将HTML视为无上下文语法而导致的像差的需要.
正则表达式可能会在大多数情况下使您获得大部分时间,但在非常常见的情况下会失败.如果你能找到一个比HTML Agility Pack更好/更快的解析器,那就去吧,但请不要让世界受到更多破坏的HTML hackery.
Ala*_*ore 38
问题太广泛,无法明确回答.您是在谈论从真实HTML文档中删除所有标记,例如网页?如果是这样,你必须:
这只是我的头脑 - 我相信还有更多.一旦你完成了所有这些,你最终会在某些地方一起运行单词,句子和段落,而在其他地方运行大块无用的空白.
但是,假设您只使用一个片段,并且只需删除所有标记即可逃脱,这里是我将使用的正则表达式:
@"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>"
Run Code Online (Sandbox Code Playgroud)
在他们自己的替代品中匹配单引号和双引号字符串足以处理属性值中的尖括号问题.我没有看到任何需要明确匹配标签内的属性名称和其他内容,如Ryan的答案中的正则表达式; 第一个替代方案处理所有这些.
如果你想知道那些(?>...)
结构,他们就是原子组.它们使正则表达式更有效率,但更重要的是,它们可以防止失控的回溯,这是你应该经常注意的,当你混合使用交替和嵌套量词时,就像我一样.我真的不认为这会是一个问题,但我知道如果我不提它,别人会.;-)
当然,这个正则表达式并不完美,但它可能就像你需要的一样好.
Rya*_*rle 25
Regex regex = new Regex(@"</?\w+((\s+\w+(\s*=\s*(?:"".*?""|'.*?'|[^'"">\s]+))?)+\s*|\s*)/?>", RegexOptions.Singleline);
Run Code Online (Sandbox Code Playgroud)
zzz*_*Bov 17
@JasonTrue是正确的,剥离HTML标签不应该通过正则表达式完成.
使用HtmlAgilityPack剥离HTML标记非常简单:
public string StripTags(string input) {
var doc = new HtmlDocument();
doc.LoadHtml(input ?? "");
return doc.DocumentNode.InnerText;
}
Run Code Online (Sandbox Code Playgroud)
Cou*_*ero 13
我想回应Jason的回应,虽然有时你需要天真地解析一些Html并提取文本内容.
我需要使用一些由富文本编辑器创建的Html,总是有趣和游戏.
在这种情况下,您可能需要删除某些标记的内容以及标记本身.
在我的情况下,标签被扔进这个混合.有些人可能会发现我(非常轻微)不太天真的实现是一个有用的起点.
/// <summary>
/// Removes all html tags from string and leaves only plain text
/// Removes content of <xml></xml> and <style></style> tags as aim to get text content not markup /meta data.
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string HtmlStrip(this string input)
{
input = Regex.Replace(input, "<style>(.|\n)*?</style>",string.Empty);
input = Regex.Replace(input, @"<xml>(.|\n)*?</xml>", string.Empty); // remove all <xml></xml> tags and anything inbetween.
return Regex.Replace(input, @"<(.|\n)*?>", string.Empty); // remove any tags but not there content "<p>bob<span> johnson</span></p>" becomes "bob johnson"
}
Run Code Online (Sandbox Code Playgroud)
在此URL尝试正则表达式方法:http://www.dotnetperls.com/remove-html-tags
/// <summary>
/// Remove HTML from string with Regex.
/// </summary>
public static string StripTagsRegex(string source)
{
return Regex.Replace(source, "<.*?>", string.Empty);
}
/// <summary>
/// Compiled regular expression for performance.
/// </summary>
static Regex _htmlRegex = new Regex("<.*?>", RegexOptions.Compiled);
/// <summary>
/// Remove HTML from string with compiled Regex.
/// </summary>
public static string StripTagsRegexCompiled(string source)
{
return _htmlRegex.Replace(source, string.Empty);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
197241 次 |
最近记录: |