RegularExpressions删除特定的HTML标记

时间:2010-12-21 20:22:37

标签: c# regex

喜 首先抱歉我的英文

我需要删除一个特定的HTML标记而不是所有标记

这个我要删除的标签

xxx

<object data="/dictionary/flash/SpeakerApp16.swf" type="application/x-shockwave-flash" width=" 16" height="16" id="pronunciation"> <param name="movie" value="/dictionary/flash/SpeakerApp16.swf"><param name="flashvars" value="sound_name=http%3A%2F%2Fwww.gstatic.com%2Fdictionary%2Fstatic%2Fsounds%2Fde%2F0%2Fman.mp3"><param name="wmode" value="transparent"><a href="http://www.gstatic.com/dictionary/static/sounds/de/0/man.mp3"><img border="0" width="16" height="16" src="/dictionary/flash/SpeakerOffA16.png" alt="listen"></a> </object>

yyy

我想要结果xxx yyy

3 个答案:

答案 0 :(得分:1)

如果您确切知道标记的内容,非正则表达式搜索和替换将更快,更有效。您对标签的形式了解多少?

此外,正则表达式&amp; HTML是一件坏事。

答案 1 :(得分:1)

虽然其他人认为使用DOM方法会更容易,但如果你不能操纵DOM而你的HTML实际上只是一个字符串,那么你可以这样做(假设C#):

string resultString = null;
try {
    resultString = Regex.Replace(subjectString, 
        @"\s+<(object)\b[^>]*>(?:[^<]|<(?!/\1))*</\1>\s*", " ", RegexOptions.IgnoreCase);
} catch (ArgumentException ex) {
    // Error catching
}

这假定<object是其唯一可能不会发生变化且标记始终以</object>结束的部分。

编辑:说明:正则表达式搜索任何空格,然后搜索<object,然后查找任何不是结束尖括号的内容,然后是对象的结束尖括号,然后搜索任何内容那是一个开角括号任何一个开放角括号而不是后跟/object(通过引用反向引用\1),尽可能多次,然后是</object>(再次使用反向引用\1),最后是任何空格。然后它取代了与单个空间匹配的内容。

EDIT2:为了提高效率,我在正则表达式的开头使用了\s+,这意味着只有在<object之前至少有一个空格字符(可以包含换行符)时才会匹配。但是,如果您的原始HTML可能具有xxx<object(例如,HTML字符串缩小),则将\s+更改为\s*\s+\s*更高效取决于C#正则表达式引擎在您正在定位的版本/系统/操作系统中的优化程度。所以试验找出哪些匹配更快。

EDIT3:正则表达式可以进一步简化为:\s+<(object)\b(?:[^<]|<(?!/\1))*</\1>\s*

答案 2 :(得分:1)

为什么在只使用IndexOf时使用正则表达式?

string html = "...";
int start;
while ((start = html.IndexOf("<object")) >=0)
{
    int end = html.IndexOf("</object>", start);
    html = html.Remove(start, end-start + "</object>".Length);
}
// now 'html' contains the html without object tags

说明:

  • 查找<object
  • 的第一个匹配项
  • 查找下一个结束标记的开头
  • 删除包含整个结束标记的部分
  • 重复直到没有留下任何对象标签