代码之家  ›  专栏  ›  技术社区  ›  jonny

如何检查HTML是否包含像<这样的扩展实体;?

  •  2
  • jonny  · 技术社区  · 14 年前

    < 4英寸

    如何确定它是否包含这些扩展序列?

    详细信息:修复“truncate”方法以避免像“2”这样的损坏字符串 &l “不要做不必要的工作。应该是这样的

    $s = HTML::Entities::decode_entities ($s) if $has_ext_chars;
    $s = substr ($s, 0, $len - 3) . '...' if length $s > $len;
    $s = HTML::Entities::encode_entities ($s, "‚„-‰‹‘-™›\xA0¤¦§©«-®°-±µ-·»") if $has_ext_chars;
    

    4 回复  |  直到 14 年前
        1
  •  1
  •   Benoit    14 年前

    完整的字符实体列表可以在 the W3C reference .

    \&#u?\d+; \&#x[a-fA-F0-9]+;

        2
  •  1
  •   Eugene Yarmash    14 年前

    来自perldoc HTML::Entities :

    模块还可以导出 散列,包含从所有字符到

    您可能可以使用它们来构建正则表达式。例如,要匹配实体:

    use HTML::Entities '%entity2char';
    
    my $regex = "&(?:" . join("|", map {s/;\z//; $_} keys %entity2char) . ");";
    
    if ($str =~ /$regex/) {
        print "$str contains entities\n";
    }
    

    这将跳过如下实体 &#entity_number; 不过。

        3
  •  0
  •   krico    14 年前

    你可以用正则表达式试试

    $str =~ /.*\&[^\s]+;.*/
    
        4
  •  0
  •   Ven'Tatsu    14 年前

    &lt;script src="evil.example.com"&gt;&lt;/script&gt; 您的代码会将其解码为有效的HTML,而不会重新编码 < > 回到实体。(代码中的尖括号不是ASCII尖括号。)

    如果要截断包含任何HTML标记或实体的字符串,如果使用简单的解决方案,则可能会中断某些内容。您最好构建一个基于HTML解析模块的解决方案。如果只查看元素中没有元素的文本,则可以获取文本,截断文本,然后将其替换回元素中。如果你必须处理混合的内容,那将会更加复杂。

    但为了不好的解决方案:

    #treats each entity as one character "2 &lt; 4" is 5 characters long
    $trunc_len = $len - 3;
    $str =~ s/^((?>(?:[^&]|&[^\s;]+;?){$trunc_len}))(?:[^&]|&[^\s;]+;?){4,}/$1.../;
    
    #abuses proceadural nature of the regexp engine 
    #treats each input character as on character "2 &lt; 4" is 8 characters long
    $str =~ s/^( (?:[^&]|&[^\s;]+;?)+ )(?(?{ $found = (pos() > ( $found ? $len - 3 : $len ))})(?!)).*$(?(?{pos() < $len })(?!))/$1.../x;
    

    两者都相当允许实体允许常见的浏览器怪癖。