代码之家  ›  专栏  ›  技术社区  ›  collimarco

ETag正则表达式

  •  0
  • collimarco  · 技术社区  · 16 年前

    我注意到 Feedzirra 使用此正则表达式从响应标头中获取ETag:

    /.*ETag:\s(.*)\r/

    就我个人而言,我会写这个:

    /ETag:\s(.*)\n/

    1. 为什么它放。*开始时,即使没有必要(未指定\A)?
    2. 为什么它使用\r而不是\n?有什么区别?
    4 回复  |  直到 16 年前
        1
  •  2
  •   Matthew Scharley    16 年前
    1. 完整性,我敢说。这不是抓捕的一部分。不过,根据语言和实现的不同,可能会有一个隐式的行锚开始,在这种情况下,这可能是必要的。
    2. HTTP规范规定HTTP将使用 "\r\n" 作为一条线的结尾。在大多数编程语言中,只有 "\n" 被视为行尾。这 \r .* 这将在捕获结束时产生错误的空白。
        2
  •  1
  •   Devin Ceartas    16 年前

    /r and /n are different characters. 
    
    /r = line ending for old macs
    /n = line ending for *nix
    /r/n = line ending for windows
    
    probably [\r\n] would be best
    
        3
  •  1
  •   Gumbo    16 年前

    让我们来看看 HTTP specification :

    ETag header field 定义为:

    ETag = "ETag" ":" entity-tag
    

    entitiy-tag 定义为:

    entity-tag = [ weak ] opaque-tag
    weak       = "W/"
    opaque-tag = quoted-string
    

    quoted-string 定义为:

    quoted-string  = ( <"> *(qdtext | quoted-pair ) <"> )
    

    所以 ETag 标题字段值可能包含换行符。正确的正则表达式是:

    /ETag:\s+(?:W\/)?"(?:[ !#-\x7E\x80-\xFF]*|\r\n[\t ]|\\.)*"/
    
        4
  •  0
  •   Michael Krelin - hacker    16 年前

    HTTP RFC 要求CRLF作为换行符 超文本传输协议 消息。所以 \n 将匹配额外 \r 使用格式正确的消息:

        generic-message = start-line
                          *(message-header CRLF)
                          CRLF
                          [ message-body ]
        start-line      = Request-Line | Status-Line
    

    也就是说,我会做到的 [\r\n]