我从日志文件中得到以下摘录,并且必须抓住“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
答案 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)/