我有这个脚本,它从文本文件中读取最后100行,然后将每一行分解为3个大块,并用空格隔开。我想检查的第三部分数据是否包含来自另一个文本文件filters.txt
中某一行的单词或短语。如果找到匹配项,那么我想用某种格式替换该单词或短语,以便使其突出。下面是我所拥有的,但是它不起作用,针对过滤器进行检查的代码无效。
任何人都可以告诉我该怎么做。
谢谢。
这是来自sample.log的一行...
12:12:46 18-10-18#:10656200,1A,29D09,RTC NOT ALERT,,CHEMIST WAREHOUSE,,,910 David Low Way,MARCOOLA,S59K7,,,
filters.txt文件中将包含以下行...
RTC
RTC伤害
RTC不会警告
RTC高机率
在上面的示例中,当我打印数据时,我希望突出显示“ RTC NOT ALERT”,以便使其突出。简而言之,对于sample.log中的每一行,我想查看是否有任何过滤器出现,如果是的话,我希望它在输出中突出显示。我是通过使用CSS更改字体样式来实现的。
<?php
// OPEN LOG FILE FOR READING
$file = array_reverse( file( 'sample.log' ));
// OPEN FILTERS LIST
$filters = file( 'filters.txt' );
// START MAIN LOOP (SHOWS LAST X LINES FROM TEXT FILE)
$limit = 100;
for ($i = 0; $i < $limit; $i++ ){
$data = explode(' ', $file[$i],3);
// CHECK FOR FILTERS AND HIGHLIGHT IF MATCHED
foreach ( $filters as $filter ){
if (strpos($data[2], $filter) !== false) {
$data[2] = str_replace($filter,"<font
class=\"highlight\">$filter</font>",$data[2]);
}
}
// PRINT LIST
print "
<div class=\"code1a\">
<font class=\"time\">$data[0] $data[1]</font><br>
$data[2]
</div>
";
}
?>
答案 0 :(得分:1)
尽管您没有在sample.log和filters.txt中提供任何示例,但我认为由于断行,您需要修剪每个$ filter。
尝试:
<?php
// OPEN LOG FILE FOR READING
$file = array_reverse( file( 'sample.log' ) );
// OPEN FILTERS LIST
$filters = file( 'filters.txt', FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES );
// START MAIN LOOP (SHOWS LAST X LINES FROM TEXT FILE)
$limit = 100;
// BECAUSE $file STARTS WITH 0
$limit -= 1;
foreach ( $file as $line => $line_content ) {
if ( $line == $limit ) {
break;
}
$data = explode( ' ', $line_content, 3 );
$highlight = $data[ 2 ];
// CHECK FOR FILTERS AND HIGHLIGHT IF MATCHED
foreach ( $filters as $filter ) {
if ( strpos( $highlight, ',' . $filter . ' ,' ) !== false ) {
$highlight = str_replace( $filter, '<font class="highlight">' . $filter . '</font>', $highlight );
}
}
// PRINT LIST
echo '<div class="code1a">';
echo '<font class="time">', $data[ 0 ], ' ', $data[ 1 ], '</font>';
echo '<br />';
echo $highlight;
echo '</div>';
}