2011-12-07 55 views
1
"outline-style: none; margin: 0px; padding: 2px; background-color: #eff0f8; color: #3b3a39; font-family: Georgia,'Times New Roman',Times,serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; border: 1px solid #ebebeb; float: left;" 

我有这个内联的CSS。我想用正则表达式来替换所有以“background”和“font”开头的属性的空格。在内嵌CSS,最后一个属性可能不会有分号作为结束如何使用正则表达式删除一些CSS属性?

我使用此代码作为Django的过滤器除去从服务器端的这些属性使用美丽的汤

def html_remove_attrs(value): 
    soup = BeautifulSoup(value) 
    print "hi" 
    for tag in soup.findAll(True,{'style': re.compile(r'')}): 
     #tag.attrs = None 
     #for attr in tag.attrs: 
     # if "class" in attr: 
     #  tag.attrs.remove(attr) 
     # if "style" in attr: 
     #  tag.attrs.remove(attr) 
     for attr in tag.attrs: 
      if "style" in attr: 
       #remove the background and font properties 

    return soup 
+0

你在做这个之前,去居住或当它击中的客户端(JavaScript?) – Jakub

+0

我必须从服务器端解析它.. –

+0

您应该重新考虑使用'内联css'来支持可重用类。 – Jakub

回答

2

我不知道你的编程环境的细节,但你要求一个正则表达式。这个正则表达式将找到的属性键(加结肠和任何空间)作为1组($1)和属性值作为第2组($2):

((?:background|font)(?:[^:]+):(?:\\s*))([^;]+) 

表达不删除的属性值。它找到它们。如何删除它们取决于您的编程环境(语言/库)。

但基本上,你会做一个全局查找/替换,用$1替换整个结果。

例如,使用Java,你可以做到这一点

public static void main(String[] args) throws Exception { 

    String[] lines = { 
     "outline-style: none; margin: 0px; padding: 2px; background-color: #eff0f8; color: #3b3a39; font-family: Georgia,'Times New Roman',Times,serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; border: 1px solid #ebebeb; float: left;", 
     "outline-style: none; margin: 0px; padding: 2px; background-color: #eff0f8; color: #3b3a39; font-family: Georgia,'Times New Roman',Times,serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; border: 1px solid #ebebeb; float: left", 
     "background-color: #eff0f8;", 
     "background-color: #eff0f8", 
    }; 

    String regex = "((?:background|font)(?:[^:]+):(?:\\s*))([^;]+)"; 

    Pattern p = Pattern.compile(regex); 

    for (String s: lines) { 
     StringBuffer sb = new StringBuffer(); 
     Matcher m = p.matcher(s); 
     while (m.find()) { 

      // capturing group(2) for debug purpose only 
      // just to get it's length so we can fill that with '-' 
      // to assist comparison of before and after 
      String text = m.group(2); 
      text = text.replaceAll(".", "-"); 
      m.appendReplacement(sb, "$1"+text); 

      // for non-debug mode, just use this instead 
      // m.appendReplacement(sb, "$1"); 
     } 
     m.appendTail(sb); 

     System.err.println("> " + s); // before 
     System.err.println("< " +sb.toString()); // after 
     System.err.println(); 
    } 
} 
+0

的确有很好的表现力。谢谢你的帮助。但是当我用这个正则表达式分割并且将所有分割的数据结合在一起时,我得到这个http://pastebin.com/n43wUw8x。 “背景*”和“字体*”的值不会被删除:( –

+0

我修改了表达式并更新了答案,包括一个例子。 – sudocode