【问题标题】:Regex Pattern Needed需要正则表达式模式
【发布时间】:2016-07-25 13:39:25
【问题描述】:

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

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

【问题讨论】:

  • 您应该尝试使用类似的工具:phpliveregex.com 另外,您希望 $url[0] 包含什么?
  • 相信我,我在我的生活 php 脚本中尝试了 1000 种变体,您提供的网址只是一个实时查看器.. 但无论如何感谢
  • 这看起来像一个系统日志,可能有解析器。尽管[0-9] 只是在寻找一个号码,但要开始。 +* 将允许多个数字;那些是quantifiers
  • 是的,它来自 apache 状态,但是它们是相同的或相似的,尤其是对于第一个值和第二个文件/VALUE2/ 的每个请求 -XX VALUE1 XX/XX/XX 都是相同的。 .
  • 尝试摆弄regex101.com/r/rH6zH6/2

标签: php regex preg-match


【解决方案1】:

我会避免“至少尝试...”这种说法。但这是你的一个开始:

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

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

您需要为所有数据更改此设置,因为我们只有 3 行需要处理。也不是完美的。但希望足以让您上路...

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

【讨论】:

    【解决方案2】:

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

    这说:

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

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

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      这是一种可能的方法:

      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上运行

      【讨论】:

      • mhm 仍然收到一个空响应.. 有人可以用正在运行的服务器测试这个吗? apache 的完整代码 .. 可能是因为之前的 foreach 循环:这就是我目前所拥有的: $id ) { echo $id."\n".$matches[2][$key]."\n" ; } } ?>
      • 一定是你没有给出确切的数据。粘贴在 cmets 中没有帮助。 cmets 中的格式隐藏了换行符和其他空白。当然,我是在服务器上运行的。链接在我的答案中。我建议你自己做一个这样的小提琴来说明问题。
      • 您是否也使用 apachectl fullstatus 命令尝试过,我可能认为这是因为 foreach 循环(第一个 foreach 循环)。
      • @[0-9] (.*?) [0-9]*[/](.*?)@si 这给了我这些例子:1005 GET 8820 GET 21881 GET,而不是GET 我需要中间的文件(/file/VALUE/)...这个答案的 PID 不同
      • with this foreach ($matches[1] as $key => $id ) { echo $id."\n".$matches[2][$key]."\n" ; }
      【解决方案4】:
      [\d-]+\s+(\d+).+?(?:GET|POST|HEAD|PUT).+?/([^/]+)/?\s+HTTP[^\s]+
      

      Regex live demo

      PHP live demo

      【讨论】:

      • $id ) { echo $id."\n".$matches[2][$key]."\n" ; } } ?> 给了我一个空的响应,可能是因为中间只有一个空格。
      • 这是 $output 的示例输出:0-15 9785 0/120/5766 W 2.51 1046 0 0.0 11.74 10135.46 182.237.133.117 domain.com:443 GET /file/786252433434128/HTTP/1.1 1-15 15844 0/100/6326 W 2.12 1654 0 0.0 23.37 11295.31 182.237.133.117 domain.com:443 GET /file/762070024199783/ HTTP/1.1 2-15 15876 0/40/6154 R 1.81 0 161 0.0 186.47 16999.30 14.167 .55.213 3-15 9153 0/130/6392 W 2.74 699 0 0.0 23.80 13756.44 182.237.133.117 domain.com:443 GET /file/404629577556625/HTTP/1.1
      • 您应该将您的 EXACT 输入添加到您的问题中。 @汤姆
      • 仍然是空的响应,如果您有一个正在运行的带有 apache 的服务器,您是否也可以尝试使用 exec 命令?我的意思是您的代码可以正常工作,但是似乎与 foreach 循环(来自 exec 命令)的某些内容不对应..
      • 我为您的两种不同输入提供了两种解决方法(带有现场演示)。因此,如果您没有得到预期的结果,要么您的输入不完全相同,要么您没有正确实施。真的,我已经完成了这一点。您应该只在我的示例中多玩一点代码,以使它们适用于您的情况。 @汤姆
      【解决方案5】:

      这可能会对你有所帮助。

      /\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

      【讨论】:

      • $output) { echo $output . ',' 。 $url[2][$k]; } } } ?>
      • 这是我的完整代码,仍然无法工作...示例输出:0-15 9785 0/120/5766 W 2.51 1046 0 0.0 11.74 10135.46 182.237.133.117 domain.com:443 GET /file /7862524334128/http/1.1 1-15 15844 0/100/6326 W 2.12 1654 0 0.0 23.37 11295.31 182.237.133.117 domain.117 domain.117 0 161 0.0 186.47 16999.30 14.167.55.213 3-15 9153 0/130/6392 W 2.74 699 0 0.0 23.80 13756.44 182.237.133.117 domain.com:443 GET /file/404629.
      • PHP 中没有g 修饰符。
      • 不,没有。 php.net/manual/en/reference.pcre.pattern.modifiers.php 测试您的代码,eval.in/611603Warning: preg_match_all(): Unknown modifier 'g'。此外,preg_match_all 的第二个和第三个参数是倒置的。第二个参数是输入,第三个是输出。
      • 您的答案应该包含所有代码。这个答案有多个错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多