使用正则表达式格式化HTTP标头

时间:2017-02-22 20:08:00

标签: javascript regex string http http-headers

我想使用正则表达式格式化我的HTTP标头。我使用split(' ')然后进行数组操作来完成它,但这次我想使用正则表达式执行此操作。

我想把这个输入作为一个巨大的字符串:

GET /v1/search?q=bob%20dylan&type=artist HTTP/1.1
Host: api.spotify.com
Cache-Control: no-cache
Postman-Token: e2f09f98-f8e0-43f7-5f0e-b16e670399e2

并将其格式化为对象:

{ headers: 
   { Host: ' api.spotify.com',
     'Cache-Control': ' no-cache',
     'Postman-Token': ' e2f09f98-f8e0-43f7-5f0e-b16e670399e2' 
   },
  verb: 'GET',
  path: '/v1/search?q=bob%20dylan&type=artist',
  protocol: 'HTTP/1.1' 
}

我理解使用split方法,我的代码更具可读性。但是,我的第一次尝试是使用正则表达式,因为我的目标是提取/格式化字符串。

我知道通过正则表达式是可能的,但它是否值得呢?每个人都在想什么?

感谢您的时间。

3 个答案:

答案 0 :(得分:3)

这应该适合你:

const data = `GET /v1/search?q=bob%20dylan&type=artist HTTP/1.1
Host: api.spotify.com
Cache-Control: no-cache
Postman-Token: e2f09f98-f8e0-43f7-5f0e-b16e670399e2`

const format = data => {
    const headers = {}
    const result = { headers }
    const regex = /([\w-]+): (.*)/g
    let temp
    while (temp = regex.exec(data)) {
        headers[temp[1]] = temp[2]
    }
    temp = data.match(/(\w+)\s+(.*?)\s+(.*)/)
    result.verb = temp[1]
    result.path = temp[2]
    result.protocol = temp[3]
    return result
}

console.log(format(data))

/([\w-]+): (.*)/g此正则表达式将匹配任何header-name: value,并像['header-name: value', 'header-name', 'value']

一样捕获它

然后我们将其设置为headers header-namekeyvaluevalue

的对象

最后我们解析第一行以获取其他信息

如何运作

(\w+)匹配并捕获1个或多个单词字符
\s+匹配1个或更多空格 (.*?)匹配并捕获任何字符 not gready *?
\s+直到找到一个或多个空白区域 (.*)匹配evrything(直到行尾)

答案 1 :(得分:2)

您可以将.split()RegExp \s/一起使用,其中.split()返回的数组的前三个元素应为verbpathprotocol;在前三个元素上使用.shift(),其余结果使用当前索引和数组的下一个索引设置为headers对象的属性,值对,直到数组.length求值为{{1在false循环的条件下。

while

答案 2 :(得分:0)

这应该有效。

搜索:

(GET)\s(.+)\s(HTTP\/\d+\.\d+)\n(Host):\s(.+)$\n(Cache-Control):\s(.+)$\n(Postman-Token):\s(.+)$

替换为:

{ headers:    \n\t{ $4 '$5',\n\t  '$6': '$7',\n\t  '$8': '$9'\n\t}, \n\tverb: '$1',\n\tpath: '$2',\n\tprotocol: '$3'\n}

JavaScript代码:



const regex = /(GET)\s(.+)\s(HTTP\/\d+\.\d+)\n(Host):\s(.+)$\n(Cache-Control):\s(.+)$\n(Postman-Token):\s(.+)$/gm;
const str = `GET /v1/search?q=bob%20dylan&type=artist HTTP/1.1
Host: api.spotify.com
Cache-Control: no-cache
Postman-Token: e2f09f98-f`;
const subst = `{ headers:    \n\t{ \$4 '\$5',\n\t  '\$6': '\$7',\n\t  '\$8': '\$9'\n\t}, \n\tverb: '\$1',\n\tpath: '\$2',\n\tprotocol: '\$3'\\n}`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log(result);




输入:

GET /v1/search?q=bob%20dylan&type=artist HTTP/1.1
Host: api.spotify.com
Cache-Control: no-cache
Postman-Token: e2f09f98-f

输出:

{ headers:    
    { Host 'api.spotify.com',
      'Cache-Control': 'no-cache',
      'Postman-Token': 'e2f09f98-f'
    }, 
    verb: 'GET',
    path: '/v1/search?q=bob%20dylan&type=artist',
    protocol: 'HTTP/1.1'
}

请参阅:https://regex101.com/r/3DKEas/4