Как изменить эту функцию php для проверки всех строк перед выполнением результата? - PullRequest
0 голосов
/ 28 марта 2020

Я исправил код, поэтому из файла следует выводить только все «строки», содержащие слово «TrxID». html. но он возвращает первый из абзаца, среди которых есть «TrxID», таким образом, есть более 3 строк, содержащих «TrxID».

File. html

    <html lang="en"> <body> <p> recieved $500<br /> to 862444947 successful<br /> Fee $ 9<br />25<br /> Balance Tk $1000<br />78<br /> TrxID 6DU2ATVQCO at 30/04/2019 19:25<br />download the app </p>

  <p> recieved $500<br /> to 862444947 successful<br /> Fee $ 9<br />25<br /> Balance Tk $1000<br />78<br /> Tr 6DU2ATVQCO at 30/04/2019 19:25<br />download the app </p>

  <p> recieved $500<br /> to 862444947 successful<br /> Fee $ 9<br />25<br /> Balance Tk $1000<br />78<br /> TrxID 6DU2ATVQgfCO at 30/04/2019 19:25<br />download the app </p>

  <p> recieved $500<br /> to 862444947 successful<br /> Fee $ 9<br />25<br /> Balance Tk $1000<br />78<br /> 6DU2ATVQCO at 30/04/2019 19:25<br />download the app </p> </body> </html>        

Функция. php

   <?php  function checkFile( $file, $keyword ) {

// open file for reading
$handle = @fopen( $file, 'r' );

// check to make sure handle is valid
if( $handle ) {

    // traverse file line by line
    while( ($line = fgets($handle)) !== false ) {

        // search for specific keyword no matter what case is used i.e. trxid or TrxID
        if( stripos($line, $keyword) === false ) {
            // string not found, continue with next iteration
            continue;
        } else {

            // keyword was found

            // close file
            fclose($handle);

            // return line
            return $line;
        }
    }
} } $result = checkFile( 'file.html', 'TrxID' );  echo $result; ?>      

Результат

recieved $500 to 862444947 successful Fee $ 9 25 Balance Tk $1000 78 TrxID 6DU2ATVQCO at 30/04/2019 19:25 download the app

Я хочу:

TrxID 6DU2ATVQCO at 30/04/2019 19:25

Теперь я хочу убедиться,

  1. Он должен только возвращать строку, содержащую 'TRXID', а не абзац, если я заменю br / на 'тег тега абзаца', результат останется таким же
  2. Он должен показать все строки, только не один результат. На этой функции он просто возвращает первое не все.

Надеюсь на вашу помощь. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Другой подход заключается в том, что вы можете передать все содержимое файла в preg_match, и вам будет возвращен массив совпадающих элементов в $ match.

$result = preg_match('/TrxID .+ at [\d]{2}\/[\d]{2}\/[\d]{4} [\d]{2}:[\d]{2}/i', $fileContents, $matches)

print_r($matches);
0 голосов
/ 28 марта 2020

Я немного изменил ваш код:

function checkFile($file, $keyword)
{
    $handle = @fopen($file, 'r');
    if ($handle) {
        while (($line = fgets($handle)) !== false) {
            if (stripos($line, $keyword) === false) {
                continue;
            } else {
                $exploded = explode('<br />', $line);
                foreach ($exploded as $e) {
                    if (stripos($e, $keyword) !== false) {
                        $lines[] = substr($e, 0, strpos($e, "at"));
                    }
                }
            }
        }
    }
    return $lines;
    fclose($handle);
}
$result = checkFile('file.html', 'TrxID');
print_r($result); // return array of lines

или, если вы хотите повторить его:

echo $output = implode('<br />', $result);

Если вы хотите просто строку после trxid:

function checkFile($file, $keyword)
{
    $fileContents = file_get_contents($file);
    $result = preg_match_all('/(?<=\b'.$keyword.'\s)(?:[\w-]+)/is', $fileContents, $matches);
    return preg_filter('/^/', $keyword.' ', $matches[0]);
}

$result = checkFile('file.html', 'TrxID');
print_r($result); // return array of lines
...