查找特定文本,直到找到它为止

时间:2013-08-30 09:27:28

标签: php

我想知道如何做到这一点,这段代码将如您所知获得特定的行,现在我需要它读取,直到像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>";
    }
}

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

4 个答案:

答案 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.
    }
 }