2010-07-31 2 views
1

어떻게 HTML 웹 페이지 charset 인코딩을 HTML에서 문자열로 인코딩하고 dom으로 인코딩하지 않을 수 있습니까?어떻게 html 웹 페이지 charset 인코딩을 html로 인코딩 할 수 있나요?

는 그와 같은 HTML 문자열 수 :

$html = file_get_contents($url); 
preg_match_all (string pattern, string subject, array matches, int flags) 

을하지만 난 정규 표현식을 몰라, 나는 웹 페이지 캐릭터 셋 (UTF-8/창-255/등) 감사를 알아 내야

+1

먼저 HTTP 헤더에서 문자 인코딩을 확인하고 누락 된 경우에만 HTML을 확인해야합니다. – Gumbo

답변

6

는 preg_match을 ('~ 문자 집합 = ([- A-Z0-9 _] +) ~ i'를, $ html로, $ 문자 집합);

+0

이것은'$ html'은 http 헤더를 포함하고 있다고 가정합니다. – mvds

+1

Please no. 페이지의 인코딩을 정의하는 방법을 설명하는 페이지를 파싱하는 경우 어떻게됩니까? ... – Artefacto

+0

... 그러면 어쨌든 인코딩되는 내용을 알 수 있습니까? –

0

당신은

mb_detect_encoding($html); 

를 사용할 수 있지만, 일반적으로 좋은 생각입니다. 대신 컬을 사용하고 Content-Type 헤더를보십시오.

+0

mb_detect_encoding ($ html)이 잘 작동하지 않는다는 것을 알고 있습니다. – Yosef

+0

그런 다음 * "대신 컬을 사용하고 Content-Type 헤더를 살펴보십시오"* – mvds

1

먼저 Content-type 헤더를 확인해야합니다.

//add error handling 
$f = fopen($url, "r"); 
$md = stream_get_meta_data($f); 
$wd = $md["wrapper_data"]; 
foreach($wd as $response) { 
    if (preg_match('/^content-type: .+?/.+?;\\s?charset=([^;"\\s]+|"[^;"]+")/i', 
      $response, $matches) { 
     $charset = $matches[1]; 
     break; 
    } 
} 
$data = stream_get_contents($f); 

그런 다음 meta 요소에 폴백 할 수 있습니다. 그것은 here 전에 답변되었습니다. 관객 기쁘게 분석 헤더의

더 복잡한 버전 :

if (preg_match('~^content-type: .+?/[^;]+?(.*)~i', $response, $matches)) { 
    if (preg_match_all('~;\\s?(?P<key>[^()<>@,;:\"/[\\]?={}\\s]+)'. 
      '=(?P<value>[^;"\\s]+|"[^;"]+")\\s*~i', $matches[1], $m)) { 
     for ($i = 0; $i < count($m['key']); $i++) { 
      if (strtolower($m['key'][$i]) == "charset") { 
       $charset = trim($m['value'][$i], '"'); 
      } 
     } 
    } 
} 
+0

패턴 구분 기호와 대소 문자가 어떻게 되었습니까? – mvds

+0

regex에는 delims가없고 greedy capture는 여러분이 원하는 것보다 훨씬 많은 것을 제공 할 것입니다 –

+0

fopen 대신 file_get_contents를 사용하지 마십시오. – Yosef

관련 문제