无法正确解码perl中的html实体

时间:2012-05-29 20:09:37

标签: html regex perl entities

我遇到了一个问题,在过去的10个小时里,我在网上寻找答案后无法解决这个问题。

我有一些这种格式的数据

??E?�?0?�?<?20120529184453+0200?20120529184453+0200?�?�?G0E?5?=20111213T103134000-136.225.6.103-30365316-1448169323, ver: 12?�?W??tP?2?�?
??|?????
??:o?????tP?�??B@?????B@????�?�?)0?�???
49471010550?�??	???tP???3??<?�?�?�?�??�?�?�?�?�??�?�?�?�?�

我有一个PHP代码,不是由我编写的,只是在其上运行html_entity_decode并返回正确的结果。

当我尝试运行Perl的decode_entities时,我得到了完全不同的结果。经过一些调试后,在我看来,PHP正在“正确地”将似乎无效的实体(例如� - 替换为它们的ascii对应物,即上述2种情况的NULL和退格。

另一方面,Perl似乎没有对那些“无效”实体进行解码,而是将它们单独留下,后来一个人搞砸了结果(通过解压缩,或者在phph的情况下,bin2hex,因为而不是解包null而不是00它将解包�)的每个字符。

我已经尝试了我能想到的一切,包括在运行decode_entities

后在perl中运行以下替换
    $var =~ s/&#(\d+);/chr($1)/g
然而,这根本不起作用。

这让我很生气,我想在perl中完成这个而不是phpI真的希望我不必在perl中编写1000个模式匹配行来覆盖所有可能的实体和数字。

任何人都知道如何解决这个问题而不必将PHP整个html_entity_decode函数解析为perl或编写无休止的模式匹配行?

1 个答案:

答案 0 :(得分:2)

你快到了。而不是

$var =~ s/&#(\d+);/chr($1)/g

$var =~ s/&#(\d+);/chr($1)/ge

/e修饰符指示Perl'e'评估替换模式。