2010-07-31 3 views
1

Comment puis-je obtenir un encodage de page Web html à partir de html comme chaîne et non comme dom?Comment est-ce que je peux encoder html charset webpage de html comme chaîne et non comme dom?

Je récupère la chaîne html comme ça:

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

, mais je ne sais pas regex, et je dois trouver page Web charset (UTF-8/Windows 255/etc ..) Merci,

+1

Vous devez vérifier l'en-tête HTTP pour un codage de caractères en premier et seulement si manquant vérifier le code HTML après. – Gumbo

Répondre

6

preg_match ('~ charset = ([- un z0-9 _] +) ~ i', $ html, $ charset);

+0

cela semble supposer que $ html contient l'en-tête http, ce qui n'est pas le cas. – mvds

+1

S'il vous plaît non. Que se passe-t-il s'il m'arrive d'analyser une page qui explique comment définir l'encodage d'une page? ... – Artefacto

+0

... alors vous savez de quoi il va être encodé de toute façon? –

0

vous pouvez utiliser

mb_detect_encoding($html); 

, mais il est généralement une mauvaise idée. Mieux vaut utiliser curl à la place et regarder l'en-tête Content-Type.

+0

Je sais que mb_detect_encoding ($ html) ne fonctionne pas bien. – Yosef

+0

Alors peut-être * "utiliser curl à la place et regarder l'en-tête Content-Type" * – mvds

1

Première chose que vous devez vérifier l'en-tête de type de contenu.

//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); 

Vous pouvez ensuite fallback sur l'élément meta. Cela a été répondu avant here.

version plus complexe de tête l'analyse syntaxique pour plaire au public:

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

ce qui est arrivé à des délimiteurs de modèle et de la casse? – mvds

+0

regex n'a pas de delims et cette capture gourmande va donner beaucoup plus que ce que vous voulez en arrière –

+0

pourquoi ne pas utiliser file_get_contents au lieu de fopen? J'ai besoin d'obtenir html à d'autres tests après – Yosef

Questions connexes