2014-04-21 3 views
2

HTML의 현대 방언과 올바른 규칙은 HTML 엔터티 (&likethat;)의 세미콜론을 생략 할 수 없습니다. 하지만 임의의 페이지를 구문 분석하고 세미콜론없이 나쁜 HTML 엔터티를 처리해야하는 작업이 있습니다. 그리고 이것은 브라우저에 의해 완벽하게 표현됩니다. PHP로 세미콜론없이 각각의 UTF-8에 HTML 엔터티를 디코딩 할 수 있습니까?PHP에서 세미콜론없이 HTML 엔터티 디코드

답변

1

당신은 모든 HTML 엔티티의 목록을 자신의 UTF-8 표현으로 세미콜론없이 모두 교체 할 경우에 사용할 수 있습니다

// get all HTML entities 
$mapping = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES | ENT_HTML5, 'UTF-8'); 

// change array values representing the entities to regex pattern with negativ lookahead for semicolon 
array_walk($mapping, function(&$value) { $value = '/'.rtrim($value, ';').'(?!;)/'; }); 

// replace all entities without semicolon by their utf8 representation 
$html = preg_replace(array_values($mapping), array_keys($mapping), $html); 
+0

http://it2.php.net/get-html-translation-table –

+0

'& # 8211 [& # 8230]'과 같은 문자열이 있습니다. 왜이 답변이 효과가 없습니까? 'html_entity_decode'는 세미콜론이 있으면 작동합니다 : '– […]' – Shawn

+0

get_html_translation_table()의 결과를 매핑 목록으로 사용하여 HTML 엔티티를 utf-8 표현으로 대체합니다. 이 함수는 & ü, & dollar ;, 등의 명명 된 html 엔티티 만 반환하지만 10 진수 표기법의 html 엔티티는 반환하지 않습니다. 그들은 매핑에 있지 않기 때문에 대체되지 않습니다. – SBH

0

내 생각 엔 DOMDocument::loadHTML을 사용하여 문서를로드하고 DOMDocument::saveHTML을 사용하여 문서를 저장해보십시오.

libxml constants을 사용하여 추가 옵션을 지정할 수 있습니다.

+0

이 그냥 모든'및''& 이러한 HTML 엔티티에서 '탈출 html-entites로 올바르게 가져 오는 대신 이 libxml 상수를 어떻게 사용해야합니까? 어떻게 도와 줄 수 있습니까? HTML은 XML이 아닙니다. 그렇습니까? – Gherman