在PHP中解析未知的字符串长度?

时间:2011-12-03 00:24:15

标签: php parsing logging

我从日志文件中得到以下摘录,并且必须抓住“NC:”和“VL#”或“目前的总违规级别#”之间的所有内容。考虑到长度未知并且没有简单的分隔符,我是否可以获取该字符串的任何想法?

  

11.11.27 14:50:41 [警告] NC:elvefromhell失败了。没有摆动:没有摆臂。 VL 3

     

11.11.27 14:50:54 [INFO] NC:Jackmac19失败了fight.direction:试图攻击看不见的实体。到目前为止的总违规水平5。

     

11.11.27 14:51:02 [警告] NC:Bugs6968失败chat.spam:上次发送消息“t”。 VL 1

     

11.11.27 14:51:26 [警告] NC:确信失败了chat.spam:上次发送的消息“hi pherce”。 VL 1

     

11.11.27 14:51:48 [警告] NC:UmbraSprite失败阻塞。鼻翼:没有摆臂。 VL 2

     

11.11.27 14:51:59 [INFO] NC:AwayDood failed.running.vertical。 VL 2

     

11.11.27 14:52:17 [INFO] NC:AwayDood无法移动.running.vertical。 VL 11

     

11.11.27 14:52:35 [INFO] NC:AwayDood failed.running.vertical。 VL 11

     

11.11.27 14:53:06 [警告] NC:AwayDood失败阻塞。鼻翼:没有摆臂。 VL 4

5 个答案:

答案 0 :(得分:3)

使用正则表达式:

$text = '11.11.27 14:50:54 [INFO] NC: Jackmac19 failed fight.direction: tried to attack out of sight entity. Total violation level so far 5.';

preg_match('/NC: (.*)?\s(VL|Total violation level so far)/', $text, $matches);
echo $matches[1];

这将一次在一行上运行。它可以用于更大的日志,但是一次处理日志似乎更健全。

<强> See it in action

答案 1 :(得分:0)

这是快速而粗糙的,但是给出了日志。如果您的日志文件格式发生变化,请小心。

preg_match_all('/NC: (.*?) (?:VL|Total violation level so far)/i', $subject, $result);

答案 2 :(得分:0)

不使用正则表达式,你可以用NC分割:

foreach($lines as $line){
    list(,$text) = explode('NC:',$line);
    print $line;
}

答案 3 :(得分:0)

不使用正则表达式(以下代码可以进行优化,但我已经将其保留为更清楚了解正在发生的事情):

$end = strlen($string);
if(false !== strpos($string, 'VL ')) {
    $end = strpos($string, 'VL ');
} else if(false !== strpos($string, 'Total violation level so far ')) {
    $end = strpos($string, 'Total violation level so far ');
}

$string = substr($string, strpos($string, 'NC: '), $end);

$string将包含一行日志文件。要在数组中获取日志文件的所有行以便于此操作,您可以执行以下操作:

$lines = file('/path/to/file.ext');

答案 4 :(得分:0)

您可以尝试正则表达式(正则表达式):

/NC:(.*)(?=VL|Total violation level so far)/