2012-05-29 2 views
0

У меня возникла проблема, которую я не могу решить, проведя последние 10 часов поиска в Интернете для ответа.Невозможно правильно декодировать html-объекты в perl

У меня есть некоторые данные в этом формате

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

У меня есть PHP-код, не написанный мною, который просто работает html_entity_decode на том, что и она возвращает правильные результаты.

Когда я пытаюсь запустить декодирование Perl, я получаю совершенно другой результат. После некоторой отладки мне кажется, что PHP «правильно» заменяет то, что кажется недействительным, например, � или , в их аналогий ascii, а именно NULL и backspace для упомянутых 2 случаев.

С другой стороны, Perl не расшифровывает эти «недействительные» сущности и оставляет их в покое, что позже один затягивает результат (который проходит через распаковку или, в случае phph, bin2hex, который терпит неудачу, а не распаковывает нуль до 00 он будет распаковывать каждый отдельный символ �).

Я попробовал все, что я могу думать о включать, выполнив следующую замену в Perl после запуска decode_entities

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

однако, что не работает вообще.

Это сводит меня с ума, и я хотел бы, чтобы это было сделано в perl, а не phpI. Надеюсь, мне не нужно писать 1000 строк соответствия шаблонов в perl, чтобы охватить все возможные сущности и числа.

Кто-нибудь, у кого есть идея, как решить эту проблему, не прибегая к необходимости разобрать PHP всю функцию html_entity_decode в perl или написать бесконечные строки соответствия шаблону?

ответ

2

Вы почти у цели. Вместо

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

говорят

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

/e Модификатор инструктирует Perl для «e'valuate шаблон замены.

+0

спасибо, очень оценен. Это решило мою проблему. – ByteFlinger