html-element 属性值中是否允许“>”(U+003E GREATER-THAN SIGN)?

Is ">" (U+003E GREATER-THAN SIGN) allowed inside an html-element attribute value?

提问人:jfs 提问时间:9/19/2008 最后编辑:Deduplicatorjfs 更新时间:2/2/2015 访问量:4146

问:

换句话说,可以使用正则表达式来匹配不包含嵌套元素的 html 元素吗?/<tag[^>]*>.*?<\/tag>/tagtag

例如 (lt.html):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>greater than sign in attribute value</title>
  </head>
  <body>
    <div>1</div>
    <div title=">">2</div>
  </body>
</html>

正则表达式:

$ perl -nE"say $1 if m~<div[^>]*>(.*?)</div>~" lt.html

和屏幕刮刀:

#!/usr/bin/env python
import sys
import BeautifulSoup

soup = BeautifulSoup.BeautifulSoup(sys.stdin)
for div in soup.findAll('div'):
    print div.string


$ python lt.py <lt.html

两者都给出相同的输出:

1
">2

预期输出:

1
2

w3c 说道:

属性值是文本的混合体 和字符引用,但 附加限制 文本不能包含不明确的 符号。

HTML 正则表达式 语法

评论

1赞 AmbroseChapel 9/25/2008
这是每个人都用来解释为什么不应该使用正则表达式来解析 HTML 的教科书示例,而应该使用 HTML 解析器。

答:

0赞 Per Hornshøj-Schierbeck 9/19/2008 #1
yeah except /<tag[^>]*>.*?<\/tag>/

不会匹配单个标签,但会匹配给定标签的第一个开始标签和最后一个结束标签。就像你的第一个非贪婪标签匹配一样,你的中间标签也应该写成非贪婪。

评论

0赞 jfs 9/19/2008
我不明白。你能举个例子吗?
0赞 PhiLho 9/16/2009
@j-f-sebastian:<div class='foo'><span>flo</span><div>bar</div></div>您首先匹配 <div,但也匹配第一个 </div
0赞 Steven A. Lowe 9/19/2008 #2

使用 > 查看是否得到相同的结果而不是>

2赞 bmdhacks 9/19/2008 #3

阅读以下内容后:

http://www.w3.org/International/questions/qa-escapes

看起来实体转义在任何地方(包括在属性中)都建议用于 < > 和 &

评论

0赞 Jim 9/19/2008
该文件是错误的。内容中大于的裸露标志是有效的。它还说单&号是错误的,但对于 HTML 来说,情况并非总是如此。
0赞 Alan Moore 4/29/2009
它并没有说大于符号是无效的,它只是建议使用实体来代替——只有傻瓜才会忽略的建议,IMO。如果大多数程序员,包括许多软件工具的作者,都认为它不是有效的,谁在乎它是否有效?
3赞 Jim 9/19/2008 #4

我相信这是有效的,W3C 验证者也同意,但这些信息的权威来源是 ISO 8879:1986 标准,其成本为 ~150 欧元/210 美元。无论如何,对它们进行编码并没有错,因此如果有疑问,请进行编码。此外,如果使用的是基于 XML 的文档类型,则需要对序列中的大于符号进行编码。]]>

4赞 kch 9/19/2008 #5

文字在 html 内容中的任何地方都是合法的,无论是在属性值内部还是作为元素中的文本。>

2赞 Troels Thomsen 9/25/2008 #6

如果您坚持使用正则表达式(适用于基本字符串操作),请尝试使用 .它应该与属性完美匹配,因此允许您访问内部内容(尽管您需要将其放在捕获组中)。<tag((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>.*?<\/tag>

你也可以使用 Html Agility Pack 来解析 HTML,如果你要进行大量的解析,我会推荐你这样做。维护大型正则表达式很容易成为令人头疼的问题,但与此同时,如果您能够这样做,它们也会更加有效。

12赞 Kornel 10/20/2008 #7

是的,这是允许的(W3C Validator 接受它,只发出警告)。

未转义,也允许在注释中,因此这种简单的正则表达式可能会被愚弄。<>

如果 BeautifulSoup 不能处理这个问题,它可能是一个错误,也可能是一个有意识的设计决策,以使其更灵活地避免属性中缺少结束引号。