我在PHP中遇到正则表达式的问题。
我正在尝试找到通过CURL收到的某些标头数据的匹配项。但是,我的正则表达式匹配两行,而不是一行。
以下是我的正则表达式:
/^(http\/\d\.\d)\s+(100)\s+([\w\-\s\/\'\"\(\)\\\.]+)$/im
这是我正在尝试匹配的字符串:
HTTP/1.1 100 Continue
HTTP/1.1 201 Created
Content-Length: 118
Content-Type: text/html; charset=UTF-8
Etag: 8c59b7e37f672374c61245c8115f53d0
Last-Modified: Tue, 16 Aug 2011 20:24:10 GMT
X-Trans-Id: txd6cbafcec90d4e30b2a108ff3157c1b1
Date: Tue, 16 Aug 2011 20:24:10 GMT
它应该匹配第一行,但我得到100和201的匹配。我不明白为什么它这样做。
顺便说一句,我正在使用preg_match。
关于如何解决这个问题的任何想法?感谢。
答案 0 :(得分:2)
多线修改器与真实原因正交。您的问题是字符类定义(方括号之间)包含\s
,它匹配任何空格字符,包括换行符。在这种情况下,将其替换为实际空间,以便与之匹配。
另外,如果您有权在服务器上安装扩展程序,则可能需要使用pecl_http
扩展名来解析http,而不是手动执行。
答案 1 :(得分:-1)
@troelskn是对的,但您也可以要求CURL告诉您HTTP响应代码:
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
编辑:而不是:
/^(http\/\d\.\d)\s(100)\s([\w\-\s\/\'\"\(\)\\\.]+)$/im
尝试(RegexPal):
/^(http\/\d\.\d)\s(100)\s([\w\-\s\/\'\"\(\)\\\.]+?)$/im