Читать всю строку из позиции, strpos ()

Как получить полную строку из позиции, полученной с помощью strpos ()?

Вот мой код:

//$route_route sample: NAXOP UZ45 VIKIK

$route_waypoint = explode(" ", $route_route);
$file = "components/airways.txt";
$contents = file_get_contents($file);

foreach ($route_waypoint as $waypoint) {

//$waypoint sample: NAXOP
$pos = strpos($contents, $waypoint);

if ($pos === false) {

continue;

} else {

$line = fgets($contents, $pos); // Here is my problem

//line sample: MES,W714,005,NAXOP,38.804139,30.546833,149,000, ,L

list($fix, $lat, $lon, $sample_data1, $sample_data2) = explode(',', $line);

echo "$fix, $lat, $lon";

}

}

Основная цель — локализовать «NAXOP», прочитать его полную строку и повторить некоторые данные. Любая помощь приветствуется!

0

Решение

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: если VIKIK приходит раньше NAXOP в $ содержание. VIKIK Не будет найден, если есть несколько случаев NAXOP || UZ45 || VIKIK будет найден только первый в каждом случае.

$len = strlen($contents);
$pos = 0;
foreach ($route_waypoint as $waypoint) {
$pos = strpos($contents, $waypoint, $pos);
if ($pos === false) {
continue;
}
else {
// Here is the critical section for matching the entire line:

// First look backwards from where $waypoint was found for the
// beginning of the line
$startOfLine = strrpos($contents, "\n", ($pos - $len));

// Next look forwards from $waypoint to find the end of the line
$endOfLine = strpos($contents, "\n", $pos);

// we already have the file in memory, just read from that,
$line = substr($contents, $startOfLine, ($endOfLine - $startOfLine));

list($fix, $lat, $lon, $sample_data1, $sample_data2)
= explode(',', trim($line));

echo "$fix, $lat, $lon";

// IDK if you want to match the same line twice or not.
$pos = $endOfLine;
}
}

Вот лучшая программа.

<?php

$str = "NAXOP UZ45 VIKIK";
$regex = "/" . preg_replace("/ /", "|", $str) . "/";

$fp = fopen("test.dat", "r");

while ($line = fgets($fp)) {
if (preg_match($regex, $line)) {
echo $line;
}
}
fclose($fp);

Вот test.dat

NAXOP
UZ45
VIKIK
UZ45 VIKIK
NAXOP
SILLYSTRING

Вот вывод

NAXOP
UZ45
VIKIK
UZ45 VIKIK
NAXOP
1

Другие решения

Я использовал эту библиотеку в очень многих программах. Проверьте это, я думаю, что это точно решит проблему, с которой вы столкнулись. Это работает так же, как он говорит ..

например

between ('@', '.', '[email protected]');
//returns 'online'
//from the first occurrence of '@'

ЦСИ: http://php.net/manual/en/function.substr.php

    <?php

function after ($this, $inthat)
{
if (!is_bool(strpos($inthat, $this)))
return substr($inthat, strpos($inthat,$this)+strlen($this));
};

function after_last ($this, $inthat)
{
if (!is_bool(strrevpos($inthat, $this)))
return substr($inthat, strrevpos($inthat, $this)+strlen($this));
};

function before ($this, $inthat)
{
return substr($inthat, 0, strpos($inthat, $this));
};

function before_last ($this, $inthat)
{
return substr($inthat, 0, strrevpos($inthat, $this));
};

function between ($this, $that, $inthat)
{
return before ($that, after($this, $inthat));
};

function between_last ($this, $that, $inthat)
{
return after_last($this, before_last($that, $inthat));
};

// use strrevpos function in case your php version does not include it
function strrevpos($instr, $needle)
{
$rev_pos = strpos (strrev($instr), strrev($needle));
if ($rev_pos===false) return false;
else return strlen($instr) - $rev_pos - strlen($needle);
};
?>
0

По вопросам рекламы [email protected]