正则表达式失败,没有错误

时间:2015-02-10 21:47:53

标签: php regex

我在名为$ test的字符串中有以下文字:

Content-Type: text/plain
Server: testapp (4.2.1 (x86_64/linux))
Content-Length: 125

{"password":"123","email_address":"","name":"j.doe","username":"jd123"}

我正在尝试在php中编写一个正则表达式,它将在content-length:125之后返回所有内容。 这就是我到目前为止所拥有的:

if (preg_match('/^Content\-Length\:[0-9\\n]+([a-zA-Z0-9\{\}\"\:])*/',$test,$result))
{
         var_dump($result[1]);
} 

我没有收到任何错误消息,但它没有找到我在字符串中定义的模式。 我也尝试过这种模式:

  '/^Content\-Length\:[0-9\\n]+([a-zA-Z0-9{}\"\:])*/'

我尝试删除大括号前面的转义字符串。但它还是不行。

你能告诉我我失踪的是什么吗? 谢谢。

编辑1

我的代码现在看起来像这样:

<?php
$test = "Content-Type: text/plain
Server: kamailio (4.2.1 (x86_64/linux))
Content-Length: 125

{"password":"test123","email_address":"","name":"j.doe","username":"jd123"}";

//if (preg_match('/Content-Length\:[0-9\\n]*([a-zA-Z0-9{}\"\:])*/',$test,$result))
//{      
//         var_dump($result);
//}

preg_match('/({.*})/', $str, $matches);
echo $matches[0];
?>

这给了我以下错误:

  

未定义的偏移量:第31行的/var/www/html/test/test.php中为0

第31行是我试图回应比赛的地方。

3 个答案:

答案 0 :(得分:0)

$str = <<<HEREDOC
Content-Type: text/plain
Server: testapp (4.2.1 (x86_64/linux))
Content-Length: 125

{"password":"123","email_address":"","name":"j.doe","username":"jd123"}
HEREDOC;

preg_match('/(\{.*\})/', $str, $matches);

echo $matches[0];

此处的正则表达式只是匹配以{开头并以}结尾的行。然而,它是一个快速而宽松的正则表达式。

答案 1 :(得分:0)

不是使用大图案来匹配所有内容(这是耗时的) - 为什么不使用preg_split将字符串剪切成两块在你想要的位置呢?

$string = 'Content-Type: text/plain
   Server: testapp (4.2.1 (x86_64/linux))
   Content-Length: 125

   {"password":"123","email_address":"","name":"j.doe","username":"jd123"}'; 

$parts = preg_split ("/Content-Length:\s*\d+\s*/", $string);

echo "The string i want is '" . $parts[1] . "'";

输出:

The string i want is '{"password":"123","email_address":"","name":"j.doe","username":"jd123"}'

答案 2 :(得分:0)

您可以完全避免使用正则表达式,因为HTTP标头始终与响应正文分开2个连续的换行符。

list($headers, $body) = explode("\n\n", $string);

或者对于Windows风格的中断(顺便提一下,它是HTTP标头的标准):

list($headers, $body) = explode("\r\n\r\n", $string);