首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在PHP中选择HTTP Accept头中的内容类型

如何在PHP中选择HTTP Accept头中的内容类型
EN

Stack Overflow用户
提问于 2009-06-26 14:19:56
回答 5查看 23.5K关注 0票数 19

我正在尝试构建一个符合标准的网站框架,它将XHTML1.1作为application/ XHTML +xml或HTML4.01作为text/html,这取决于浏览器的支持。目前,它只是在accept头中的任何地方查找"application/xhtml+xml“,如果它存在,就使用它,但这并不灵活- text/html可能会有更高的分数。此外,当使用其他格式(WAP、SVG、XForms等)时,它将变得更加复杂。都已添加。那么,有没有人知道一段经过测试和测试的PHP代码,可以从服务器提供的字符串数组中选择客户端最支持的代码或基于客户端分数的有序列表?

EN

回答 5

Stack Overflow用户

发布于 2009-07-06 15:05:44

我的库中的一小段代码:

function getBestSupportedMimeType($mimeTypes = null) {
    // Values will be stored in this array
    $AcceptTypes = Array ();

    // Accept header is case insensitive, and whitespace isn’t important
    $accept = strtolower(str_replace(' ', '', $_SERVER['HTTP_ACCEPT']));
    // divide it into parts in the place of a ","
    $accept = explode(',', $accept);
    foreach ($accept as $a) {
        // the default quality is 1.
        $q = 1;
        // check if there is a different quality
        if (strpos($a, ';q=')) {
            // divide "mime/type;q=X" into two parts: "mime/type" i "X"
            list($a, $q) = explode(';q=', $a);
        }
        // mime-type $a is accepted with the quality $q
        // WARNING: $q == 0 means, that mime-type isn’t supported!
        $AcceptTypes[$a] = $q;
    }
    arsort($AcceptTypes);

    // if no parameter was passed, just return parsed data
    if (!$mimeTypes) return $AcceptTypes;

    $mimeTypes = array_map('strtolower', (array)$mimeTypes);

    // let’s check our supported types:
    foreach ($AcceptTypes as $mime => $q) {
       if ($q && in_array($mime, $mimeTypes)) return $mime;
    }
    // no mime-type found
    return null;
}

示例用法:

$mime = getBestSupportedMimeType(Array ('application/xhtml+xml', 'text/html'));
票数 20
EN

Stack Overflow用户

发布于 2013-07-27 08:19:32

根据记录,Negotiation是一个用于处理内容协商的纯PHP实现。

票数 9
EN

Stack Overflow用户

发布于 2016-04-29 04:19:42

合并了@maciej-Łebkowski和@chacham15 15解决方案,以及我的问题、修复和改进。如果您传递$desiredTypes = 'text/*'并且Accept包含text/html;q=1,则将返回text/html

/**
 * Parse, sort and select best Content-type, supported by a user browser.
 *
 * @param string|string[] $desiredTypes The filter of desired types. If &null then the all supported types will returned.
 * @param string $acceptRules Supported types in the HTTP Accept header format. $_SERVER['HTTP_ACCEPT'] by default.
 * @return string|string[]|null Matched by $desiredTypes type or all accepted types.
 * @link Inspired by http://stackoverflow.com/a/1087498/3155344
 */
function resolveContentNegotiation($desiredTypes = null, $acceptRules = null)
{
    if (!$acceptRules) {
        $acceptRules = @$_SERVER['HTTP_ACCEPT'];
    }
    // Accept header is case insensitive, and whitespace isn't important.
    $acceptRules = strtolower(str_replace(' ', '', $acceptRules));

    $sortedAcceptTypes = array();
    foreach (explode(',', $acceptRules) as $acceptRule) {
        $q = 1; // the default accept quality (rating).
        // Check if there is a different quality.
        if (strpos($acceptRule, ';q=') !== false) {
            // Divide "type;q=X" into two parts: "type" and "X"
            list($acceptRule, $q) = explode(';q=', $acceptRule, 2);
        }
        $sortedAcceptTypes[$acceptRule] = $q;
    }
    // WARNING: zero quality is means, that type isn't supported! Thus remove them.
    $sortedAcceptTypes = array_filter($sortedAcceptTypes);
    arsort($sortedAcceptTypes, SORT_NUMERIC);

    // If no parameter was passed, just return parsed data.
    if (!$desiredTypes) {
        return $sortedAcceptTypes;
    }

    $desiredTypes = array_map('strtolower', (array) $desiredTypes);

    // Let's check our supported types.
    foreach (array_keys($sortedAcceptTypes) as $type) {
        foreach ($desiredTypes as $desired) {
            if (fnmatch($desired, $type)) {
                return $type;
            }
        }
    }

    // No matched type.
    return null;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1049401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档