0

什么正则表达式将与 JavareplaceAll()方法一起操作以从 HTML 字符串中删除<p>html 标记及其标记之间的内容?

例如,应用该方法后,

"<div><p>table <b>test</b> title</p><table><tbody><tr><td>this is table cell value</td></tr></tbody></table><p>miscellaneous contents</p><span>blah</span></div>"

变成:

"<div><table><tbody><tr><td>this is table cell value</td></tr></tbody></table><span>blah</span></div>"

注意:这是一个“学术”练习。我不是在寻找使用 XML/HTML 解析器的解决方案。


更新:

越来越接近这个解决方案(谢谢,jlordo!)......你的模式似乎有点工作......

但是,建议的正则表达式字符串 ("<[pP]>.*?</[pP]>") 似乎对<p>包含属性(即,在本例中为“样式”属性)的标签没有影响——见下文

    public static void main(String[] args)
    {
        String htmlstring = "<div><p style='text-align: center; font-style: italic'>[click the <b>submit</b> button to create the new company.]</p><table><tbody><tr><td>this is table cell value</td></tr></tbody></table><p>miscellaneous contents</p><span>blah</span></div>";
        htmlstring = htmlstring.replaceAll("<[pP]>.*?</[pP]>", "");
    }

htmlstring(擦洗之前):

<div><p style='text-align: center; font-style: italic'>[click the <b>submit</b> button to create the new company.]</p><table><tbody><tr><td>this is table cell value</td></tr></tbody></table><p>miscellaneous contents</p><span>blah</span></div>

htmlstring(擦洗后):

<div><p style='text-align: center; font-style: italic'>[click the <b>submit</b> button to create the new company.]</p><table><tbody><tr><td>this is table cell value</td></tr></tbody></table><span>blah</span></div>

我们可以做些什么来“调整”它以便它处理这个问题?

4

2 回答 2

1

尝试

    htmlstring = htmlstring.replaceAll("(?i)<p.*?>.*?</p>", "");

请注意, (?i) 表示打开不区分大小写的标志

于 2013-04-19T00:16:07.720 回答
1
Pattern.compile(
  // A start p tag.
  "<p(?![a-z0-9:\\-])([^>\"']|\"[^\"]*\"|'[^']*)*>"
  + ".*?"   // Phrasing content that does not handle comment, RCDATA or raw text boundaries
  // An end p tag
  + "</p(?![a-z0-9:\\-])[^>]*>",
  Pattern.DOTALL | Pattern.CASE_INSENSITIVE);

Pattern.DOTALL标志将导致.*?匹配换行符,这是必要的,因为您的原始正则表达式不会匹配其正文中包含换行符的任何段落。

Pattern.CASE_INSENSITIVE没有指定标志,因为Pattern.UNICODE_CASE它是不必要的,而且我不相信土耳其语折叠不会造成微妙的维护危险,如果这个正则表达式被修改以处理<i>.

([^>"']|"[^"]*"|'[^']*)部分匹配任何标签正文字符或引用属性。它会在某些非验证属性名称(例如<p ain't-this=confusing>. 属性语法是常规的,但是对属性值和名称中的引号字符进行全面处理会极大地扩展此正则表达式的大小,并且可能不会有帮助,因为任何需要全面处理的东西都必须处理反引号可以引用的事实一些浏览器上的属性,这意味着没有一个正则表达式可以为任意混乱的 HTML 找到值边界。

确保标签的(?![a-z0-9:\\-])名称是“p”而不是“plaintext”或“p-”或“p:foo”或其他以“p”为前缀的 HTML 标识符。

这可能在某些结构上起作用,例如:

  • <p><!-- </p> -->Not an orphaned end tag</p>
  • <p><textarea>Not a paragraph</p></textarea></p>
  • <noscript><p>Not a paragraph contextually</p></noscript>
  • <p ain't-this=confusing>Foo</p> <p>Isn't recognized as separate</p>.
  • <p><script>alert("Not a real </p> tag");</script></p>
于 2013-04-19T00:36:21.010 回答