我正在尝试使用for循环对字符串数组执行preg_match
,但它只返回数组中最终项的过滤结果。
这是我的代码:
<!-- language: lang-php -->
$file = "smalllog";
$handle = fopen($file, 'rb');
if ($handle) {
$lines = array();
$count = 0;
while ( ($line = fgets($handle)) !== false) {
if(strpbrk($line,"/tracking/p2x/")) {
$lines[$count]['string'] = $line;
$count++;
}
}
fclose($handle);
}
for($i=0;$i<count($lines);$i++) {
$matches = array();
preg_match("/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) (\".*?\") (\".*?\")$/", $lines[$i]['string'], $matches);
print_r($matches);
print '<br /><br />';
}
哪个应显示爆炸阵列列表。然而,我实际看到的看起来更像是这样:
Array()
Array()
Array ( !--correctly exploded data in here--! )
如果这是一个愚蠢的问题,我道歉 - 我的PHP技能不是很好。
编辑:以下是似乎已纠正此问题的更改:
更改正则表达式:
"/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) (\".*?\") (\".*?\")$/"
为:
"/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) (\".*?\") (\".*?\")/"
(放弃$
)
答案 0 :(得分:0)
$preg_match_all就是你想要的
$file = "smalllog";
$handle = fopen($file, 'rb');
if ($handle) {
$lines = array();
$count = 0;
while ( ($line = fgets($handle)) !== false) {
if(strpbrk($line,"/tracking/p2x/")) {
$lines[$count]['string'] = $line;
$count++;
}
}
fclose($handle);
}
for($i=0;$i<count($lines);$i++) {
$matches = array();
preg_match_all("/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) (\".*?\") (\".*?\")$/", $lines[$i]['string'], $matches);
print_r($matches);
print '<br /><br />';
}
答案 1 :(得分:0)
你正在使用strpbrk()完全错误的strpbrk期望它的第二个参数是字符列表,你显然是在尝试用它来搜索一个字符串。使用 strpos()。
答案 2 :(得分:0)
你的行末尾有\ n字符(最后一行除外),因为正常。*不匹配\ n你的模式不匹配。你需要使用DOTALL修饰符,在你的模式的末尾添加“s”(在分隔符之后)你应该没问题:
"/^(\S+) ... (\".*?\")$/s"