0

さて、最初に検索してみましたが、この質問や検索フレーズの言い方がよくわかりませんでした。説明させてください。

私は次のようなデータを持っています:

<!-- data:start -->
    <!-- 0:start -->
        <!-- 0:start -->0,9<!-- 0:stop -->
        <!-- 1:start -->0,0<!-- 1:stop -->
        <!-- 2:start -->9,0<!-- 2:stop -->
        <!-- 3:start -->9,9<!-- 3:stop -->
        <!-- 4:start -->0,9<!-- 4:stop -->
    <!-- 0:stop -->
    <!-- 1:start -->
        <!-- 0:start -->1,5<!-- 0:stop -->
        <!-- 1:start -->1,6<!-- 1:stop -->
        <!-- 2:start -->3,6<!-- 2:stop -->
        <!-- 3:start -->3,8<!-- 3:stop -->
        <!-- 4:start -->4,8<!-- 4:stop -->
    <!-- 1:stop -->
    <!-- 2:start -->
        <!-- 0:start -->0,7<!-- 0:stop -->
        <!-- 1:start -->1,7<!-- 1:stop -->
    <!-- 2:stop -->
<!-- data:stop -->

つまり、基本的にはたくさんのポイントです。これは、次のような配列を作成するために、現在使用しているコードです。

Array (
    0 => Array (
        0 => "0,9",
        1 => "0,0",
        2 => "9,0",
        3 => "9,9",
        4 => "0,9"
    ),
    1 => Array (
        0 => "1,5",
        1 => "1,6",
        2 => "3,6",
        3 => "3,8",
        4 => "4,8"
    ),
    2 => Array (
        0 => "0,7",
        1 => "1,7"
    )
)

ただし、次のような配列が返されます。

Array (
    0 => "0,9",
    1 => "0,0",
    2 => "9,0"
)

画面に表示されている大きな配列を見ると、照合時にその変数の最初のインスタンスが設定されていることがわかります。では、最初に最も広い一致を見つけてから、内部を処理するにはどうすればよいですか。現在使用している関数は次のとおりです。

function explosion($text) {
    $number = preg_match_all("/(<!-- ([\w]+):start -->)\n?(.*?)\n?(<!-- \\2:stop -->)/s", $text, $matches, PREG_SET_ORDER);
    if ($number == 0) return $text;
    else unset($item);
    foreach ($matches as $item) if (empty($data[$item[2]])) $data[$item[2]] = $this->explosion($item[3]);
    return $data;
}

私が見落としていたのは愚かで単純なことだと確信していますが、それはあなたにとって簡単な答えになると思います。

編集:これは、このサンプルを取得したデータセット全体の完全な出力ログです。タグは印刷され(>と<に置き換えてください)、<code></code>読みやすいようにすべて巨大な要素の中にあります。

これがめちゃくちゃになっている部分です:

Array ( [0] => <!-- 0:start --> <!-- 0:start -->0,9<!-- 0:stop -->  [1] => 0 [2] => <!-- 0:start -->0,9 )

0 => <!-- 0:start -->0,9

そのため、その中の別のピースの停止タグが最初に出現したときに停止します。反対の方向を考えて、最初に小さいピースを処理し、大きいピースを中断しないようにそれらを置き換えてから、大きいピースを処理する必要がありますか?

4

2 に答える 2

2

どうぞ:

function explosion($text) {
    preg_match_all("/<!-- ([\d]+):start -->(.+?)<!-- .*:stop -->/", $text, $matches, PREG_SET_ORDER);

    $return = array();
    foreach($matches as $match) {
        if($match[1]==0) {
            $return[] = array();
        }
        $return[count($return)-1][] = $match[2];
    }   
    return $return;
}
于 2010-03-22T09:25:42.507 に答える
1

これは私にとってはうまくいきます:

function explosion($text) {
    $number = preg_match_all('/<(.*?)>(.+?)[<]/s', $text, $matches);
    if ($number == 0) return $text;

    $temp = array();
    $data = array();
    foreach($matches[2] as $coords){
        if(trim($coords)==""){
            if(!empty($temp)){
                $data[] = $temp;
                $temp = array();
            }
        }else{
            $temp[] = $coords;
        }
    }
    return $data;
}

コードの問題は、サブタグとタグ付きの値を取得していたことです。もちろん、ブラウザで印刷すると非表示になりますので、デバッグのためにログをとってみてください。

于 2010-03-22T10:07:36.633 に答える