需要正则表达式模式

时间:2016-07-25 13:39:25

标签: php regex preg-match

希望有人能够帮助找到这个正则表达式模式: 如果我有这个要求:

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

5 个答案:

答案 0 :(得分:0)

我会避免"至少尝试......"高谈阔论。但这是一个开始:

/^\d{1,}-\d{2,} (\d+) .+ \/file\/(\d+)\/ .+$/

基本上我们正在寻找您的起始ID(我猜它的ID),例如1-15然后捕获后面的数字。然后寻找/file/.../并在那里捕捉数字。

您需要为所有数据更改此数据,因为我们只有3行可以处理。它也不完美。但希望足以让你顺利上路......

https://regex101.com/r/dE8lE2/1

答案 1 :(得分:0)

这是我喜欢的模式,因为它可以在不同的上下文中重用: ^(?:\ S + \ S +){1}(\ S + \ S +){1}。?(?:\ S + \ S +){11}的(\ d +) $

这说:

  • ^ - '从行的开头'
  • (?:\ S + \ s){1} - 在没有捕获的情况下使用一列 - \ S +表示“获取一个或多个非空格字符”'并且\ s +'获得一个或多个空格字符' parens和{1}并非绝对必要,但如果您想跳过第一个' n'则可以方便重复使用。列
  • (\ S + \ s) - 捕获下一栏(第2栏)中的值
  • (?:\ S + \ s){11} - 略过接下来的11列
  • 。*?(\ d +) - 消耗任何字符的最小数量,但不包括数字;然后捕获一个或多个连续数字
  • 。* $ - 识别字符的剩余部分,直到行尾($) - 这不是严格必要的,但如果想使用查找/替换工具查看行转换结果,则非常有用

模式的捕获部分是第2列和第14列的数字部分(有多种方法可以捕获数字部分,如至少另外一个答案中所述)。

希望这有帮助。

答案 2 :(得分:0)

[\d-]+\s+(\d+).+?(?:GET|POST|HEAD|PUT).+?/([^/]+)/?\s+HTTP[^\s]+

Regex live demo

PHP live demo

答案 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

eval.in

上查看它

答案 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