192.168.93.24`2012-03-31 10:02:05`GET /91063b13bf8ba59b896804d829b0ff20/0/0/apk/index.php?system=source&module=bibei&app=0&f=9_3_0_0_0`http://192.168.93.55:9090/apk/index.php?app=0`Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.0 Safari/535.7有这么一个字符串,注意里面有这么一个串f=9_3_0_0_0,它可能有,也可能没有,它的位置不固定,只知道肯定在问好后面,`前面,现在要做这么一个事情,试图匹配到f=后面的5个数字(不是固定的), 如果没有f参数,获取全部为空就可以了,请大神出招。谢谢!
preg_match_all('/\bf=([\d_]+)\b/m', $s, $r);
print_r($r[1]);Array
(
[0] => 9_3_0_0_0
)
====192.168.93.24`2012-03-31 10:02:05`GET /91063b13bf8ba59b896804d829b0ff20/0/0/apk/index.php?system=albums&module=list&app=0`http://192.168.93.55:9090/apk/index.php?system=source&module=bibei&app=0&f=9_3_0_0_0`Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.0 Safari/535.7192.168.93.24`2012-03-31 10:02:05`GET /91063b13bf8ba59b896804d829b0ff20/0/0/apk/index.php?system=source&module=bibei&app=0&f=9_3_0_0_0`http://192.168.93.55:9090/apk/index.php?app=0`Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.0 Safari/535.7
192.168.93.24`2012-03-31 10:02:05`GET /91063b13bf8ba59b896804d829b0ff20/0/0/apk/index.php?system=source&module=bibei&app=0&f=9_3_0_0_0 | 2012-03-31 10:02:05 | 91063b13bf8ba59b896804d829b0ff20 | 0 | 0 | source | bibei | 9 | 3 | 0 | 0 | 0
$str = <<<log
192.168.93.24`2012-03-31 10:02:05`GET /91063b13bf8ba59b896804d829b0ff20/0/0/apk/index.php?system=albums&module=list&app=0`http://192.168.93.55:9090/apk/index.php?system=source&module=bibei&app=0&f=9_3_0_0_0`Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.0 Safari/535.7
192.168.93.24`2012-03-31 10:02:05`GET /91063b13bf8ba59b896804d829b0ff20/0/0/apk/index.php?system=source&module=bibei&app=0&f=9_3_0_0_0`http://192.168.93.55:9090/apk/index.php?app=0`Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.0 Safari/535.7
log;
preg_match_all('#GET\s*[^`]+\?(?:(?!&f=)[^`])+(?:&f=([0-9_]+)\s*)?(?=`)#i',$str,$m);
print_r($m);exit;
你#9的那个固定串最好结合进来,这样效率也高。
Array
(
[0] => Array
(
[0] => GET /91063b13bf8ba59b896804d829b0ff20/0/0/apk/index.php?system=albums&module=list&app=0
[1] => GET /91063b13bf8ba59b896804d829b0ff20/0/0/apk/index.php?system=source&module=bibei&app=0&f=9_3_0_0_0
[2] => GET /91063b13bf8ba59b896804d829b0ff20/0/0/apk/index.php?system=source&module=bibei&t=2&f=9_3_0_0_0
[3] => GET /91063b13bf8ba59b896804d829b0ff20/0/0/apk/index.php?system=albums&module=list&app=0&ccc=666
) [1] => Array
(
[0] =>
[1] => 9_3_0_0_0
[2] => 9_3_0_0_0
[3] =>
))
$str=<<<log
index.php?system=a&f=9_3_0_0_0
index.php?system=b&f=9_3
index.php?system=c
log;
preg_match_all('/system=(\w+)(?:&f=([\d_]+))?/i',$str,$m);
print_r($m);
楼主的意思是 像上面的串,要匹配出system 和 f两个参数,f不存在就留空 对不? 结果如下Array
(
[0] => Array
(
[0] => system=a&f=9_3_0_0_0
[1] => system=b&f=9_3
[2] => system=c
)
[1] => Array
(
[0] => a
[1] => b
[2] => c
)
[2] => Array
(
[0] => 9_3_0_0_0
[1] => 9_3
[2] =>
)
)
192.168.93.24`2012-03-31 10:02:05`GET /91063b13bf8ba59b896804d829b0ff20/0/0/apk/index.php?system=albums&module=list&app=0`http://192.168.93.55:9090/apk/index.php?syste
m=source&module=bibei&app=0&f=9_3_0_0_0`Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.0 Safari/535.7
192.168.93.24`2012-03-31 10:02:05`GET /91063b13bf8ba59b896804d829b0ff20/0/0/apk/index.php?system=source&module=bibei&app=0&f=9_3_0_0_0`http://192.168.93.55:9090/apk/in
dex.php?app=0`Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.0 Safari/535.7
保存一个文件叫 twoline.log
上面是两行数据下面是php代码<?php$file = file("twoline.log");foreach ($file as $line)
{
preg_match("(\d+\.\d+\.\d+\.\d+\`(\d+\-\d+\-\d+ \d+:\d+:\d+)\`GET /([0-9a-zA-Z]{32})/(\d{0,5})/(\d)/apk/index.php\?system=(\w{1,20})&module=(\w{1,20})[^`]*(?:&
f=(9_3_0_0_0))?)", $line, $m); var_dump($m);
}
f=(9_3_0_0_0))?)", $line, $m);
------------------------------------------------
嗯,问题在于那个[^`]*,这个已经把f=9_3_0..匹配了。
所以为什么我在#12楼要这么写
(?:(?!&f=)[^`])+
就是[^`]+先匹配不带有&f=的串
或许你的情况应该用*而不是+
(?:(?!&f=)[^`])*
第一种方法:
preg_match("#\d+\.\d+\.\d+\.\d+\`(\d+\-\d+\-\d+ \d+:\d+:\d+)\`GET /([0-9a-zA-Z]{32})/(\d{0,5})/(\d)/apk/index.php\?system=(\w{1,20})&module=(\w{1,20})(?:(?!&f=
)[^`])*(?:&f=(?:(\d+)_(\d+)_(\d+)_(\d+)_(\d+)))?[^`]*#", $line, $m);第二种方法:
preg_match("#\d+\.\d+\.\d+\.\d+\`(\d+\-\d+\-\d+ \d+:\d+:\d+)\`GET /([0-9a-zA-Z]{32})/(\d{0,5})/(\d)/apk/index.php\?system=(\w{1,20})&module=(\w{1,20})(?:[^`]*&
f=(?:(\d+)_(\d+)_(\d+)_(\d+)_(\d+)))?[^`]*#", $line, $m);两种方法均可行,感谢foolbirdflyfirst说明原因