我想删除任何标记,如Java正则表达式或XML解析器?
<p>hello <namespace:tag : a>hello</namespace:tag></p>
成为
<p> hello hello </p>
什么是做到这一点,如果它是正则表达式由于某种原因,这是现在工作的任何人都可以帮助的最佳方式?
(<|</)[:]{1,2}[^</>]>
编辑: 添加
我想删除任何标记,如Java正则表达式或XML解析器?
<p>hello <namespace:tag : a>hello</namespace:tag></p>
成为
<p> hello hello </p>
什么是做到这一点,如果它是正则表达式由于某种原因,这是现在工作的任何人都可以帮助的最佳方式?
(<|</)[:]{1,2}[^</>]>
编辑: 添加
绝对使用XML解析器。 Regex should not be used to parse *ML
为这些目的使用解析器像lxml
或BeautifulSoup
>>> 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。
如果你只是想拉明文一些简单的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的情况,这会中断。
因此,总结一下......如果它很简单,请做一些类似上面的事情,而不是正则表达式。如果不那么简单,那么请倾听其他人使用高级解析器。
他没有指定他是从流中读取还是仅从字符串读取,或者他的内容是否具有CDATA或类似内容,以便部分答案不同。我只是提供了一个涵盖问题域的大部分子集的简单解决方案。谢谢你的批评。 – 2012-02-02 23:05:11
+1 - 对不起,我的坏。建立一个伪编辑,以便我的upvote可以计数。 – sln 2012-02-02 23:46:37
这是我个人用于解决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();
}
直接链接:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – 2012-02-02 22:40:16
@LouisWasserman:我刚加入该链接。这个答案是一个标准。 – RanRag 2012-02-02 22:42:56
如果按照“标准”你的意思是“艺术作品”,那么是的。 – 2012-02-02 22:43:59