2013-08-30 3 views
4

Мне было интересно, как это сделать, этот код будет, как вам известно, получить конкретную строку, теперь мне нужно его прочитать до определенного текста, например 55, и перестает читать оттуда. Как вы видите, журнал содержит некоторые пробелы, и какую функцию я могу использовать для чтения до кода 55?Найдите конкретный текст до тех пор, пока он не будет найден.

$row['MtID'] = уникальный идентификатор, указывающий линию, в которой находится результат.

Так, например, журнал результата будет

MM3,67624563 (уникальный идентификатор (MtID), 233262345599, http://mywebsite.com:8080/web/mm3_pixel.php?sspdata=ams1CIv44qa26LGkchACGKqShLrCtZieSyINNDEuMTkwLjg4LjIwOCgB&vurlid=993211,http://mywebsite.net/sspx?id=69171&sspdata=ams1CIv44qa26LGkchACGKqShLrCtZieSyINNDEuMTkwLjg4LjIwOCgB >> OK , 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

Ваш якорь не работает. Он перенаправляет меня на другую страницу – Martijn

+0

, эта ссылка является всего лишь примером того, как система сообщает об ошибке. – Furry

+0

Хорошая идея не использовать «Как вы знаете», когда это код, которого мы никогда не видели. Тем не менее, кто говорит, что «55» тоже не где-то в данных? Ваша ссылка на пример выглядит так, будто у вас отсутствует какой-либо разделитель кода, вы можете заключить его в обратные тики или пробелы в нем, чтобы он был кодом, чтобы мы точно знали, где именно вы должны были использовать новые строки? –

ответ

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>"; 
+0

Это не тот ответ, который я хочу, мне нужно, чтобы он зациклился до тех пор, пока не получится «55», а затем остановится и повторит результат. – Furry

+0

Это похоже на то, что это делает.Когда он соответствует '$ row ['MtID']', он повторяет результат, а затем останавливает цикл с 'break'. – Barmar

+0

@Furry ... это именно то, что это делает ... –

0

Вы можете использовать флаг FILE_SKIP_EMPTY_LINES в запросе file, чтобы пропустить пустые строки, а затем используйте 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>"; 
} 
+0

Пробовал, он не работает, и он показывает, что каждый результат журнала становится бесконечным результатом. – Furry

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 будет работать.

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. 
    } 
} 
+0

Код, похоже, имеет проблему. Вышла неожиданная ошибка конца. – Furry

+0

К сожалению, это было пропущенное закрытие} foreach. выйдите из редактирования. @Furry – SaidbakR

Смежные вопросы