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

如何替换Perl中所有HTML编码的重音符号?

  •  4
  • mandel  · 技术社区  · 16 年前

    我有以下情况:

    有一个工具可以从web界面获取XSLT,并将XSLT嵌入XML文件中(应该有人被解雇了)。“不幸的是”我在一个讲法语的国家工作,因此XSLT有很多带口音的单词。当XSLT嵌入XML中时,该工具将所有重音转换为HTML代码(Iacute、igraf等)。

    我的Perl代码正在从XML中检索XSLT,并使用Xalan命令行工具对另一个XML执行它。每当XSLT中有一些重音时,Xalan工具都会抛出异常。

    我最初想做一个正则表达式来更改XSLT usch中的所有重音:

    # the & is omitted in the codes becuase it will be rendered in the page
    $xslt =~s/Aacute;/Á/gso;
    $xslt =~s/aacute;/á/gso;
    $xslt =~s/Agrave;/À/gso;
    $xslt =~s/Acirc;/Â/gso;
    $xslt =~s/agrave;/à/gso;
    

    但这样做意味着我必须为每个重音代码编写一个正则表达式。...

    我的问题是,在不为每段代码编写正则表达式的情况下,还有什么方法可以做到这一点吗?(认为这是唯一的解决办法,让人想吐。)

    顺便说一句,这个工具是TeamSite,它很糟糕。....

    编辑: 我忘了提到我需要一个只支持Perl的解决方案,安全性不允许我安装他们一周左右没有检查过的任何类型的库:(

    4 回复  |  直到 16 年前
        1
  •  6
  •   gpojd    16 年前

    你可以试试 HTML::Entities .来自POD:

    use HTML::Entities;
    $a = "Våre norske tegn bør &#230res";
    decode_entities($a);
    #encode_entities($a, "\200-\377");  ## not needed for what you are doing
    

    为了响应您的编辑,HTML::Entities不在perl核心中。它可能仍然安装在您的系统上,因为它被许多其他库使用。您可以通过运行以下命令进行检查:

    perl -MHTML::Entities -le 'print "If this prints, the it is installed"'
    
        2
  •  1
  •   Community CDub    8 年前

    因为你的目的是 HTML::Entities 最好的解决方案,但如果你找不到符合你需求的现有软件包,以下方法比多种方法更有效 s/// 声明

    # this part do in inter function module code which is executed in compile time
    # or place in BEGIN or do once before first s/// statement using it
    my %trans = (
      'Aacute;' => 'Á',
      'aacute;' => 'á',
      'Agrave;' => 'À',
      'Acirc;' => 'Â',
      'agrave;' => 'à',
    ); # remember you can generate parts of this hash for example by map
    
    my $re = qr/${ \(join'|', map quotemeta, keys %trans)}/;
    
    # this code place in your functions or methods
    s/($re)/$trans{$1}/g; # 'o' is almost useless here because $re has been compiled yet
    

    编辑 :没有必要 e 正则表达式修饰符,如所述 Chas. Owens .

        3
  •  0
  •   Powerlord    16 年前

    我不认为有可能让TeamSite将其保留为utf-8/将其转换为utf-8?

    CGI.pm有一个(未记录的)unescapeHTML函数。然而,由于它没有文档记录(我也没有查看过源代码),我不知道它是否只处理基本的HTML实体(<,>,&)或更多。然而,我猜测它只处理基本实体。

        4
  •  0
  •   AmbroseChapel    16 年前

    为什么有人会因为将XSL(即XML)放入XML文件而被解雇?