Обнаружить удаленную кодировку в php - PullRequest
0 голосов
/ 15 апреля 2010

Я бы хотел определить кодировку удаленной страницы, обнаружив тег заголовка Content-Type

<meta http-equiv="Content-Type" content="text/html; charset=XXXXX" />

если присутствует.

Я получаю удаленную страницу и пытаюсь выполнить регулярное выражение, чтобы найти необходимые настройки, если они есть. Я все еще учусь, следовательно, проблема ниже ... Вот что у меня есть:

    $EncStart = 'charset=';
    $EncEnd = '" \/\>';
    preg_match( "/$EncStart(.*)$EncEnd/s", $RemoteContent, $RemoteEncoding );
    echo = $RemoteEncoding[ 1 ];

Вышеприведенное действительно повторяет название кодировки, но не знает, где остановиться, поэтому выводит на печать остаток строки, а затем большую часть удаленной страницы в моем тесте. Пример: при тестировании удаленной русской страницы печаталось:

windows-1251 "/>
остальная часть страницы ....

Это означает, что $EncStart было в порядке, но часть регулярного выражения $EncEnd не смогла остановить сопоставление. Этот мета-заголовок обычно заканчивается тремя различными вариантами после имени кодировки.

"> | "/> | " />

Я не знаю, пригодится ли это, чтобы удовлетворить конец обработки и, если да, как избежать этого. Я играл разными способами, но ни один из них не работал.

Заранее благодарим за помощь.

Ответы [ 2 ]

1 голос
/ 15 апреля 2010

добавьте знак вопроса к вашему шаблону, чтобы сделать его нежадным (и также не нужно 's')

preg_match( "/charset=\"(.+?)\"/", $RemoteContent, $RemoteEncoding );
echo $RemoteEncoding[ 1 ];

обратите внимание, что это не будет обрабатывать charset = "..." или charset='...' и многие другие комбинации.

0 голосов
/ 15 апреля 2010

Взгляните на Простой HTML Dom Parser . С его помощью вы можете легко найти кодировку из головы, не прибегая к громоздким регулярным выражениям. Но, как уже прокомментировал Дэвид, вы также должны проверить заголовки на ту же информацию и расставить приоритеты в случае ее обнаружения.

Протестированный пример:

require_once 'simple_html_dom.php';

$source = file_get_contents('http://www.google.com');
$dom = str_get_html($source);
$meta = $dom->find('meta[http-equiv=content-type]', 0);
$src_charset = substr($meta ->content, stripos($meta ->content, 'charset=') + 8);

foreach ($http_response_header as $header) {
    @list($name, $value) = explode(':', $header, 2);
    if (strtolower($name) == 'content-type') {
        $hdr_charset = substr($value, stripos($value, 'charset=') + 8);
        break;
    }
}

var_dump(
    $hdr_charset,
    $src_charset
);
...