希望有人能够帮助找到这个正则表达式模式: 如果我有这个要求:
1-15 20241 0/0/6205 W 1.13 1071 0 0.00 11138.15 118.100.162.102 domain.com:443 GET /file/192493511503562/ HTTP/1.1
2-15 6252 0/130/6078 W 5.50 387 0 0.0 490.28 16798.43 14.33.181.155 domain.com:443 GET /file/720658522052690/ HTTP/1.1
3-14 9649 0/157/5992 G 4.37 1807 0 0.0 296.81 13625.69 212.252.56.41 domain.com:443 GET /file/512530584447085/ HTTP/1.1
另一个示例输出(按源代码)
0-16 1005 0/59/6014 W 2.15 648 0 0.0 114.91 10535.48 178.235.43.134 domain.com:443 GET /file/152577842120081/ HTTP/1.1 1-16 8820 0/22/6489 W 0.96 1790 0 0.0 100.79 11996.02 177.221.26.229 domain.com:443 GET /file/415757652884349/ HTTP/1.1 2-16 28288 0/35/6723 W 1.46 178 0 0.0 68.29 18010.46 89.3.212.185 domain.com:443 GET /file/687013016222044/ HTTP/1.1 3-16 10274 0/0/6736 W 0.07 2275 0 0.0 0.00 14280.77 46.176.105.15 domain.com:443 GET /file/321646937401965/ HTTP/1.1 4-16 29945 0/2/7471 W 0.02 210 0 0.0 0.01 16350.10 190.158.29.250 domain.com:443 GET /file/333674884214997/ HTTP/1.1 5-16 29245 0/2/7699 W 0.01 272 0 0.0 1.07 20284.17 49.48.250.12 domain.com:443 GET /file/781792728276923/ HTTP/1.1
之间只有一个空格。 我需要获得这些价值观:
20241
192493511503562
6252
720658522052690
9649
512530584447085
所以目前我的preg_match_all看起来像是:
preg_match_all('@[0-9] (.*?) [0-9]/@si', $output, $url) ;
foreach($url[1] as $output ) { echo $output ; }
我如何获得这两个值?当前的preg_match只回显第一个值。所以例如20241 6252 ......等我试过这个
preg_match_all('@[0-9] (.*?) [0-9]*/(.*?)/@si', $output, $url) ;
foreach($url[0] as $output ) { echo $output ; }
但仍然不是我想要的结果[0]。也许你的一些人可以提供帮助。
编辑: 澄清这是exec的输出('/ usr / local / apache / bin / apachectl fullstatus',$ output); foreach($ output as $ output){和代码} .. 所以我只需要一个apache进程的PID和REQUEST
答案 0 :(得分:0)
我会避免"至少尝试......"高谈阔论。但这是一个开始:
/^\d{1,}-\d{2,} (\d+) .+ \/file\/(\d+)\/ .+$/
基本上我们正在寻找您的起始ID(我猜它的ID),例如1-15
然后捕获后面的数字。然后寻找/file/.../
并在那里捕捉数字。
您需要为所有数据更改此数据,因为我们只有3行可以处理。它也不完美。但希望足以让你顺利上路......
答案 1 :(得分:0)
这是我喜欢的模式,因为它可以在不同的上下文中重用: ^(?:\ S + \ S +){1}(\ S + \ S +){1}。?(?:\ S + \ S +){11}的(\ d +) $
这说:
模式的捕获部分是第2列和第14列的数字部分(有多种方法可以捕获数字部分,如至少另外一个答案中所述)。
希望这有帮助。
答案 2 :(得分:0)
答案 3 :(得分:0)
这是一种可行的方法:
preg_match_all('/\S+\s+(\d+).*?file\/(\d+).*?$/m', $output, $url) ;
foreach(array_combine($url[1], $url[2]) as $num1 => $num2) {
echo "$num1 $num2\n";
};
样本数据的输出:
20241 192493511503562
6252 720658522052690
9649 512530584447085
上查看它
答案 4 :(得分:-2)
这可能会对你有帮助。
/\d+\-\d+\s+(\d+).+\/file\/(\d+)/g
测试链接: https://regex101.com/r/kM3qR3/1
PHP:
preg_match_all('/\d+\-\d+\s+(\d+).+\/file\/(\d+)/g', $output, $url) ;
foreach($url[1] as $k => $output )
{
echo $output . ',' . $url[2][$k];
}
<强> 编辑: 强>
phpfiddle:http://sandbox.onlinephpfunctions.com/code/0be40cc84a0f02b89a9181aef63c3706e607e7ab