子周围有一百万个备忘单,它们以不同的理解水平枚举了由各种版本和规范的HTML指定的字符实体。 我不想相信其中任何一个,所以我想我会把它扔在这里,看看是否有人发布更权威的答案。
因此,假设我想使用正则表达式匹配任何和所有字符引用和实体。 我会从/&(?:#(?:x[0-9a-f]+|[0-9]+)|[a-z]{???,???});/i
开始. 但是???
会是什么? 我可以想到两个字符长的实体,如 lt
和 gt
,但是在 HTML 的任何规范中是否有任何单字母实体? 同样,最长的实体是什么? 最后,除了直接键入文字字符之外,这些是在HTML中表达文字字符的唯一三种语法,不是吗?
HTML5中最长的是∳
,并且没有一个字母的名称。
但请注意,命名实体引用并不像您想象的那样工作。某些命名字符引用不以分号结尾,因此正则表达式不会削减芥末。
HTML5 规范现在明确描述了自 90 年代中期以来浏览器用于执行的纠错操作: 如果它与已知的字符引用不匹配,则逐字显示内容。因此,如果您希望正则表达式像浏览器一样工作,则必须复制浏览器的行为。
这意味着,您必须针对已知引用的完整列表进行测试,例如Jukka提到的列表。您可以通过巧妙地使用括号来缩写该术语,
[aeiou]uml
但是您需要将浏览器拥有的相同知识烘焙到正则表达式中,以获得相同的结果。
编辑:顺便说一下,命名实体也可能包含数字,例如&ensp13;
。
遵循SGML传统,实体名称过去有2到7个字母,在HTML 4.01规范(和XHTML规范)中仍然如此。但是HTML5草稿添加了大量的实体,在那里称为命名字符引用,其中一些相当长,如EmptyVerySmallSquare
。因此,最好避免任何固定的上限 - 或大于1的下限。