我想知道如何做到这一点,这段代码将如您所知获得特定的行,现在我需要它读取,直到像55这样的特定文本并停止从那里读取。正如您所看到的,日志包含一些空格,因此在代码55之前我可以使用哪些函数进行读取?
$row['MtID']
=一个唯一的ID,用于指定结果所在的行。
例如,结果的日志将是
MM3,67624563(唯一ID(MtID),233262345599,http://mywebsite.com:8080/web/mm3_pixel.php?sspdata=ams1CIv44qa26LGkchACGKqShLrCtZieSyINNDEuMTkwLjg4LjIwOCgB&vurlid=993211,http://mywebsite.net/sspx?id=69171&sspdata=ams1CIv44qa26LGkchACGKqShLrCtZieSyINNDEuMTkwLjg4LjIwOCgB>>确定 ,55
$logfile = file("https://myweb.com/Pixel-Full.php?file=".$country."/".$today."-pixel-response.log");
foreach($logfile as $line_num = > $line) {
if (strpos($line, $row['MtID']) !== false) {
$getresult = strstr(htmlspecialchars($line), 'http://');
echo "<td>".$getresult."</td>";
}
}
这个系统是这样的,用户请求一些东西而没有找到,所以在我们的日志中,它会发布用户请求的错误链接和错误代码,让我们知道它是什么问题。因此,一旦系统读取该行并继续读取其他行,直到找到代码,它就会停止
答案 0 :(得分:3)
$startline = count($logfile)+1;
foreach($logfile as $line_num => $line) {
if (strpos($line, $row['MtID']) !== false) {
$startline = $line_num;
$getresult = trim(strstr(htmlspecialchars($line), 'http://'));
if (strpos($getresult, ",55") !== false) {
$getresult = substr($getresult,0,strpos($getresult, ",55")+3);
break;
}
}
if ($line_num > $startline) {
$getresult .= trim(htmlspecialchars($line));
if (strpos($getresult, ",55") !== false) {
$getresult = substr($getresult,0,strpos($getresult, ",55")+3);
break;
}
}
}
echo "<td>".$getresult."</td>";
答案 1 :(得分:0)
您可以使用file调用中的FILE_SKIP_EMPTY_LINES
标记跳过空行,然后使用array_slice获取所需数组的部分。
$file = array_slice(file("https://myweb.com/Pixel-Full.php?file={$country}/{$today}-pixel-response.log", FILE_SKIP_EMPTY_LINES), 0, $row['MtID']);
foreach($file as $line) {
$result = strstr(htmlspecialchars($line), 'http://');
echo "<td>{$result}</td>";
}
答案 2 :(得分:0)
当积极匹配是最重要的伎俩时,看起来停止执行。这可以休息一下。 (http://php.net/manual/en/control-structures.break.php)
//get the file as a string
$logfile = file_get_contents("https://myweb.com/Pixel-Full.php?file=".$country."/".$today."-pixel-response.log", false);
//make up some rows and catch the false
if ($logfile !== false) {
$logrows = explode("\n", $logfile);
//loop
foreach($logrows as $line) {
if (strpos($line, $row['MtID']) !== false) {
$getresult = strstr(htmlspecialchars($line), 'http://');
echo "<td>".$getresult."</td>";
break;
}
}
}
else echo "Log resource unavailable";
//some memory clearing
unset($logfile);
unset($logrows);
我建议使用匹配的健全性,确保日志记录格式使MtID
变量在日志文本中找不到,除非它是正匹配。使用UUID或特定的ID格式可行。
答案 3 :(得分:0)
正如您所看到的,有时候,日志行可能会分为三行,而在其他一些时候,只有一行:
// Three lines
http://www.yourwebsite.com/error/33/happycodingneverending&errorcode=33,
succcess=false;
,55
// one line
http://www.yourwebsite.com/error/33/happycodingneverending&errorcode=33,succcess=false;,55
在这种情况下,你只需要对你的代码进行一些修改,只需要一行示例就可以使用这三行,如下所示:
foreach($logfile as $line_num = > $line) {
if (strpos($line, $row['MtID']) !== false) {
$getresult = strstr(htmlspecialchars($line), 'http://');
if(!$getresult){
$theExactLine = $line_num - 2;
$getresult = $logfile[$theExactLine];
}
echo "<td>".$getresult."</td>";
break; // to stop looping.
}
}