我在名为$ 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行是我试图回应比赛的地方。
答案 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);