正则表达式解析特定模式

时间:2014-04-05 06:40:28

标签: php regex

我有一个巨大的日志文件来解析PHP,它寻找这样的东西(请注意,变量的变量将被标记):

16:09:47.925 T#10648 PresenceManager: à¿šnoticing[specialchar]$name[specialchar]0x8fac711e4bf14e62-d-s111.221.74.46:40022-r[IP]:48914-l192.168.1.2:48914f2812a403bdc6ade

我希望能够查找包含$ name的这一行,然后解析出[IP]部分,这是一个IP。请注意,我标记的两个特殊字符位置无法在帖子中显示。

这就是我所拥有的:

if(preg_match('/' . $name . '*?-r(\d+\.\d+\.\d+\.\d+)/', $contents, $results))

然而,它似乎没有像D:

那样找到给定的ip

Pastebinny :: http://pastebin.com/YHh4fndP

$ log = https://mega.co.nz/#!Scc11A6K!RXziJU_Ii43o1gcQetEfS7Kfzt-bY7VTJXljpCS7Gfc(用户名为sliceteam)

谢谢!

1 个答案:

答案 0 :(得分:1)

现在我了解了如何找到IP,请试试regex

/(?:variable.*?-r)((?:\d{1,3}\.){3}\d{1,3})/

variable显然是您要包含$name变量的地方。这使用非捕获组来查找variable,后跟任何最多-r的字符(IP' s先行者),然后捕获类似IP的字符串。我将IP定义为3组1-3个数字,后跟一个句点,后跟最后一组1-3个数字。

我不想这么说,但似乎你的脚本中有不同的错误。我将您的代码缩小到:

<?php
$name = 'sliceteam';
$log = (array_pop(glob('debug-20140405-1732.log')));
$contents = file_get_contents($log);
if (preg_match_all("/(?:$name.*?-r)((?:\d{1,3}\.){3}\d{1,3})/", $contents, $results))
{
    echo json_encode(array('status' => 'success', 'success' => $results[1]));
}
?>

它返回{"status":"success","success":["168.62.23.92","213.146.168.254"]}(这对我来说似乎非常正确;)`)。运行整个脚本时会得到什么......我可以尝试与您一起调试问题。