0

在过去的 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 似乎没有解码那些“无效”实体并将它们单独留下,后来一个搞砸了结果(通过 unpack 或在 phph 的情况下,bin2hex 失败,因为它不会将 null 解包为 00解包 ) 的每个单独的字符�

我已经尝试了所有我能想到的方法,包括在运行 decode_entities 之后在 perl 中运行以下替换

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

然而,这根本不起作用。

这让我发疯了,我想在 perl 而不是 php 中完成这项工作我真的希望我不必在 perl 中编写 1000 行模式匹配行来涵盖所有可能的实体和数字。

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

4

1 回答 1

2

您快到了。代替

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

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

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

于 2012-05-29T20:18:49.783 回答