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

时间:2008-09-18 17:08:49

标签: html regex syntax

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

例如(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

and screen-scraper:

#!/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说:

  

属性值是文本的混合   和字符引用,除了   额外的限制   文字不能含有歧义   符号

7 个答案:

答案 0 :(得分:9)

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

在评论中也允许使用非转义<>,因此可以愚弄这种简单的正则表达式。

如果BeautifulSoup没有处理这个问题,那么它可能是一个错误,也可能是一个有意识的设计决定,使其在属性中缺少关闭引号更具弹性。

答案 1 :(得分:3)

我认为这是有效的,W3C验证人同意,但该信息的权威来源是ISO 8879:1986标准,其成本约为150EUR / 210USD。无论如何,对它们进行编码并没有错,所以如果有疑问,请编码。此外,如果您使用的是基于XML的文档类型,则需要在序列]]>中编码大于号的符号。

答案 2 :(得分:3)

文字>在html内容中无处不在,包括属性值内部和元素内的文本。

答案 3 :(得分:2)

阅读以下内容后:

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

看起来实体转义在任何地方都被建议(包括在属性中)&lt; &GT;和&amp;

答案 4 :(得分:2)

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

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

答案 5 :(得分:0)

yeah except /<tag[^>]*>.*?<\/tag>/

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

答案 6 :(得分:0)

看看你是否使用&amp; gt;得到了相同的结果而不是&gt;