3

次のようなテキスト ブロックがあるとします。

<item>
   foo bar foo bar 
   <item> child item </item>
</item>
<item>
   second item
   <item> second child </item>
</item>

ここで、解析対象の s の上位 2 つのレベルのみを解析<item>し、結果が次のような配列で返されるようにする必要があります。

[0] = "foo bar foo bar  <item>child item</item>"
[1] = "second item  <item>second child </item>";

ただし、私のテストでは、子レベルの<item>タグがパターンに一致するため、それらも含まれており、必要に応じて 2 要素配列ではなく 4 要素配列を取得します。

これは私が使用したパターンです:

%<item>(.+)</item>%si

何か案は?

編集: これは HTML 用ではなく、dom パーサーを使用できないカスタムの社内スクリプト言語用です。したがって、正規表現ソリューションを提案してください。

4

3 に答える 3

3
%<p>(.+?)^</p>%smi

編集

$text = "<item> foo bar foo bar <item> child item </item> </item> <item> second item <item> second child </item> </item>";
preg_match_all('%<item>(.*?<item>.*?</item>).*?</item>%si', $text, $matches);
print_r($matches[1]);

出力

Array
(
    [0] =>  foo bar foo bar <item> child item </item>
    [1] =>  second item <item> second child </item>
)
于 2012-11-16T20:49:33.450 に答える
1

正規表現は、あなたがしていることにはあまり適していません。このルートを追求すると、別のルートをたどる場合よりも多くの時間を費やすことになるでしょう。DOM パーサーを調べてみることをお勧めします。以下のものはかなり使いやすく、基本的なニーズに対応するはずです。

PHP シンプルな HTML DOM パーサー

また、この質問もチェックしてください。追加の選択肢が得られるためです。

于 2012-11-16T20:29:17.390 に答える
0

入力は HTML ではなく、HTML のような文字列を提供したとあなたは言います。ほら、正規表現は、マークアップされたテキストではなく、プレーンテキストで最適に機能します。このタイプの入力の背後にある実際の言語は明らかにされていないため、私が提案できる解決策は、文字が要素ノード間のリテラルとして(エンティティとしてのみ)表示されないという仮定に基づいています。<

つまり、否定文字クラス を使用して量指定子を[^<]適用できます。*

%<item>([^<]+)</item>%i

正規表現のデモPHPのデモを参照してください。

$text = "<item> foo bar foo bar <item> child item </item> </item> <item> second item <item> second child </item> </item>";
preg_match_all('%<item>([^<]*)<item>%i', $text, $matches);
print_r($matches[1]);
// => Array ( [0] =>  foo bar foo bar  [1] =>  second item )
于 2016-12-09T10:23:07.703 に答える