1

編集:

私がHTMLを解析しようとしていると思われているようですが、ログを解析しようとしていることを2、3回強調しており、<option>構造は私のログに似ています。

私のログは次のようになります。

!# [2013-03-04 14:51:31] // cluster1 BEGIN \\ 
!## apache: 41
!## mysql: 31
!## tomcat: 81
!## lotus: 985
!# [2013-03-04 14:51:56] // cluster1 END \\ 
!# [2013-03-04 14:51:56] // cluster2 BEGIN \\ 
!## apache: 13
!## mysql: 61
!## tomcat: 6
!## lotus: 513
!# [2013-03-04 14:52:13] // cluster2 END \\ 

この正規表現を機能させることができません。おそらくそれは不可能です。助けが必要です:)

基本的に、私は一度に親エンティティから複数の子要素を正規表現しようとしています。簡潔にするために<select>、例としてドロップダウンHTML要素を使用します。これは実際にログの解析に使用されますが、どの形式になるかはまだ正確にはわかりません。ドロップダウン要素は、ログの構造を説明しなくても、必要なものに限りなく近いものです。

したがって、ドロップダウンがあると仮定しましょう。

<select class="parent">
    <option value="1">First child</option>
    <option value="2">Second child</option>
    <option value="3">Third child</option>
    ...
</select>

親から要素を分離するため<option>に、私はこれを使用します:

preg_match_all('/<select class="parent">(.*)<\/select>/is', $source, $matches);

これは素晴らしいことです。しかし今、私はpreg_match()自分の要素を除外するために1秒を実行する必要があるので、次<option>のようになります。

preg_match_all('/<option value="(.*?)" >(.*?)<\/option>/is', $matches['1'], $finalMatches);

そして、私は私の結果をうまく得ています。しかし、2つのコマンドを1つのルールに組み合わせる方法はありますか?したがって、親要素(この場合はブロック)を見つけて、その親内で見つかった各エントリ<select class="parent">*</select>を除外しますか?<option value="*">*</option>次に、最初の結果を繰り返してから、各繰り返しで別のpreg_match関数を完了するのではなく、親子の組み合わせの完全な配列が残ります。

4

1 に答える 1

2

私はこれがあなたが探しているものだと思います:

preg_match_all(
    '~(?:<select class="parent">|\G)\s*<option value="(.*?)">(.*?)</option>~i',
    $source, $matches);

\G前の一致が終了した位置(または前の一致がなかった場合は入力の先頭)に一致を固定します。したがって、最初の一致には開始<select>タグと最初の<option>要素が含まれ、その後の各一致には次の <option>要素が含まれます。後の要素内の一致を見つけるためにスキップすることはありません<select>

これがデモです。\Kマッチスタートリセット演算子も使用出力が読みやすくなると思います。それは、通常の制限なしに、それ以前のすべてを効果的に前向きな後読みに変えます。

于 2013-03-05T14:11:49.687 に答える