Проблема регулярного выражения PHP при попытке сопоставления чисел - PullRequest
1 голос
/ 17 августа 2011

У меня проблема с регулярными выражениями в 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.

Есть идеи, как мне это решить?Спасибо.

Ответы [ 2 ]

2 голосов
/ 17 августа 2011

Обновление:

Многострочный модификатор ортогонален реальной причине.Ваша проблема в том, что определение класса символов (которое в квадратных скобках) включает \s, что соответствует любому символу пробела, включая разрывы строк.В этом случае замените его фактическим пробелом, чтобы он соответствовал только этому.

В качестве отступления, если у вас есть доступ к установке расширений на вашем сервере, вы можете использовать pecl_http* 1008.* расширение для разбора http, вместо того, чтобы делать это вручную.

0 голосов
/ 17 августа 2011

@ 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
...