2012-05-29 2 views
0

지난 10 시간 동안 인터넷에서 답변을 검색 한 후 해결할 수없는 문제가 있습니다.perl에서 html 엔티티를 제대로 디코딩 할 수 없음

은 내가 그냥에서의 html_entity_decode를 실행하는 나에 의해 작성되지 않은 PHP 코드를 가지고 있으며 올바른 결과를 반환 형식

??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??<?�?�?�?�??�?�?�?�?�??�?�?�?�?� 

에서 일부 데이터를 가지고있다.

Perl의 decode_entities를 실행하면 완전히 다른 결과를 얻습니다. 일부 디버깅 후에 그것은 PHP가 "적절하게"잘못된 항목 (예 : � 또는 )을 아스키 대응 항목, 즉 언급 된 2 개의 사례에 대한 NULL 및 백 스페이스로 바꾸는 것으로 보입니다.

Perl은 "유효하지 않은"엔티티를 디코드하지 않고 나중에 하나의 결과가 나올 수 있습니다. (어느 것이 압축을 풀거나 phph의 경우 bin2hex에서 null을 언팩하기보다 실패하기 때문에) 00으로 설정하면 �의 개별 문자가 압축 해제됩니다.

내가 생각할 수있는 모든 것을 시도 포함 전혀 작동하지 않습니다하지만 실행 decode_entities

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

후 펄에서 다음과 같은 대체를 실행.

이것은 나를 미치게 만들고 나는 이것을 phl보다는 오히려 perl로하고 싶습니다. 가능한 모든 엔티티와 숫자를 다루기 위해 perl에서 1000 개의 패턴 일치 행을 쓸 필요가 없길 바랍니다.

PHP 전체 html_entity_decode 함수를 perl로 구문 분석하거나 끝없는 패턴 매칭 라인을 작성하지 않고이 문제를 해결하는 방법을 알고있는 사람이 있습니까?

답변

2

거의 다 왔어. 대신

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

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

/e 수정은 '대체 패턴을 e'valuate 펄 지시 말한다.

+0

감사합니다. 그게 내 문제를 해결해 줬어. – ByteFlinger

관련 문제