来自preg_match_all

时间:2017-04-06 04:27:13

标签: php arrays preg-match-all

第一次尝试在SO上发帖。 也很抱歉,如果多次被问到这个问题,我想我会在这里阅读大部分内容,但仍然没有骰子。

我有一个生成的日志文件continaing text我希望在日志文件中提取行是这样的: {22:30:47}系统:" Obambivas" StarPos :( - 59.938,7.375,56.813)ly身体:13 RelPos:( - 0.529636,-0.130899,0.838064)km NormalFlight

到目前为止,我已经通过preg_match_all管理以获得匹配,并且工作正常。 但是我真的需要每个系统:""只有一次,因为日志可能有几个非常相同。

我曾尝试使用array_unique,但我相当确定我使用它是错误的,因为它要么没有重建或相同的结果,即发现每个匹配10+匹配

所以我只需要来自日志文件中找到的匹配项的每个唯一匹配。

我的代码到目前为止(抱歉,如果它凌乱) 并提前感谢

if (is_dir($log) && is_readable($log)) {


if (!$files = scandir($log, SCANDIR_SORT_DESCENDING)) {

}
$newest_file = $files[0];

if (!$line = file($log . "/" . $newest_file)) {

} else {

  foreach ($line as $line_num => $line) {


        $pos = strpos($line, 'System:"');

        $pos2 = strrpos($line, "ProvingGround");

        if ($pos !== false && $pos2 === false) {

            preg_match_all("/\System:\"(.*?)\"/", $line, $matches);
            $cssystemname = $matches[1][0];
            $curSys["name"] = $cssystemname;


            preg_match_all("/\StarPos:\((.*?)\)/", $line, $matches2);
            $curSys["coordinates"] = $matches2[1][0];
            $coord_parts = explode(",", $curSys["coordinates"]);

            $curSys["x"] = $coord_parts[0];
            $curSys["y"] = $coord_parts[1];
            $curSys["z"] = $coord_parts[2];

            echo $curSys["name"].' | Coords: '.$curSys["x"].','.$curSys["y"].','.$curSys["z"].'<br />';

        }

    }
}

}

1 个答案:

答案 0 :(得分:0)

我添加了$ hash数组以避免重复

if (is_dir($log) && is_readable($log)) {


if (!$files = scandir($log, SCANDIR_SORT_DESCENDING)) {

}
$newest_file = $files[0];

if (!$line = file($log . "/" . $newest_file)) {

} else {

  $hash = array();

  foreach ($line as $line_num => $line) {


    $pos = strpos($line, 'System:"');

    $pos2 = strrpos($line, "ProvingGround");

    if ($pos !== false && $pos2 === false) {

        preg_match_all("/\System:\"(.*?)\"/", $line, $matches);
        $cssystemname = $matches[1][0];
        if ($hash[$cssystemname] == "")
        {
           $curSys["name"] = $cssystemname;


           preg_match_all("/\StarPos:\((.*?)\)/", $line, $matches2);
           $curSys["coordinates"] = $matches2[1][0];
           $coord_parts = explode(",", $curSys["coordinates"]);

           $curSys["x"] = $coord_parts[0];
           $curSys["y"] = $coord_parts[1];
           $curSys["z"] = $coord_parts[2];

           echo $curSys["name"].' | Coords: '.$curSys["x"].','.$curSys["y"].','.$curSys["z"].'<br />';

    }
   } else $hash[$cssystemname] = "inhash";
 }
}