2012-02-02 46 views
3

我想删除任何标记,如Java正则表达式或XML解析器?

<p>hello <namespace:tag : a>hello</namespace:tag></p> 

成为

<p> hello hello </p> 

什么是做到这一点,如果它是正则表达式由于某种原因,这是现在工作的任何人都可以帮助的最佳方式?

(<|</)[:]{1,2}[^</>]> 

编辑: 添加

回答

3

绝对使用XML解析器。 Regex should not be used to parse *ML

+0

直接链接:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – 2012-02-02 22:40:16

+0

@LouisWasserman:我刚加入该链接。这个答案是一个标准。 – RanRag 2012-02-02 22:42:56

+1

如果按照“标准”你的意思是“艺术作品”,那么是的。 – 2012-02-02 22:43:59

3

为这些目的使用解析器像lxmlBeautifulSoup

>>> import lxml.html as lxht 
>>> myString = '<p>hello <namespace:tag : a>hello</namespace:tag></p>' 
>>> lxht.fromstring(myString).text_content() 
'hello hello' 

在这里,你不应该使用正则表达式是一个reason为什么你不应该用正则表达式解析HTML/XML。

+0

+1 - 我的错误。我只想看到标准的解决方案“不要用正则表达式进行xml解析”,你的解决方案很抱歉! – sln 2012-02-02 23:45:05

+0

@sln:但你没有提出我的意见:P。 – RanRag 2012-02-02 23:46:04

+0

我试过了,但它希望你编辑它之前它会反对我的投票upvote。只要做一个伪编辑,我的upvote就会启用。我会稍后再回来看看。 – sln 2012-02-03 00:43:06

2

如果你只是想拉明文一些简单的XML,最好的(最快,最小的内存空间)是只运行一个for循环在数据:

伪代码中

bool inMarkup = false; 
string text = ""; 
for each character in data // (dunno what you're reading from) 
{ 
    char c = current; 
    if(c == '<') inMarkup = true; 
    else if(c == '>') inMarkup = false; 
    else if(!inMarkup) text += c; 
} 

注意:如果在解析中遇到类似CDATA,JavaScript或CSS的情况,这会中断。

因此,总结一下......如果它很简单,请做一些类似上面的事情,而不是正则表达式。如果不那么简单,那么请倾听其他人使用高级解析器。

+0

他没有指定他是从流中读取还是仅从字符串读取,或者他的内容是否具有CDATA或类似内容,以便部分答案不同。我只是提供了一个涵盖问题域的大部分子集的简单解决方案。谢谢你的批评。 – 2012-02-02 23:05:11

+0

+1 - 对不起,我的坏。建立一个伪编辑,以便我的upvote可以计数。 – sln 2012-02-02 23:46:37

0

这是我个人用于解决java类似问题的解决方案。用于此的库是Jsoup:http://jsoup.org/

在我的特殊情况下,我不得不打开标签,其中包含一个特定值的属性。你看到这个代码反映出来,它不是这个问题的确切解决方案,但可能会让你走上前路。

public static String unWrapTag(String html, String tagName, String attribute, String matchRegEx) { 
    Validate.notNull(html, "html must be non null"); 
    Validate.isTrue(StringUtils.isNotBlank(tagName), "tagName must be non blank"); 
    if (StringUtils.isNotBlank(attribute)) { 
     Validate.notNull(matchRegEx, "matchRegEx must be non null when an attribute is provided"); 
    }  
    Document doc = Jsoup.parse(html); 
    OutputSettings outputSettings = doc.outputSettings(); 
    outputSettings.prettyPrint(false); 
    Elements elements = doc.getElementsByTag(tagName); 
    for (Element element : elements) { 
     if(StringUtils.isBlank(attribute)){ 
     element.unwrap(); 
     }else{ 
     String attr = element.attr(attribute); 
     if(!StringUtils.isBlank(attr)){ 
      String newData = attr.replaceAll(matchRegEx, ""); 
      if(StringUtils.isBlank(newData)){ 
      element.unwrap(); 
      } 
     }   
     } 
    } 
    return doc.html(); 
    }