4

我想知道怎么做,正如你所知,这段代码会得到特定的行,现在我需要它读取到像 55 这样的特定文本并从那里停止读取。如您所见,日志包含一些空格,那么在代码 55 之前我可以使用什么函数来读取?

$row['MtID']= 用于指定结果所在行的唯一 ID。

因此,例如结果的日志将是

MM3,67624563 (Unique 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>";
    }
}

这个系统是这样的,用户请求了一些东西,但什么也没找到,所以在我们的日志上,它会发布用户请求的错误链接和错误代码,以便我们知道是什么问题。因此,一旦系统读取该行并继续读取其他行直到找到代码,它就会停止

4

4 回答 4

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>";
于 2013-09-02T02:59:18.403 回答
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 格式会起作用。

于 2013-09-04T03:57:37.720 回答
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.
    }
 }
于 2013-09-04T23:01:24.540 回答
0

您可以使用文件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>";
}
于 2013-09-02T03:07:48.703 回答