3

これは正規表現の達人への質問です。

一連の xml ノードがある場合、現在のノードと同じレベルに存在する含まれているノード値を (正規表現を使用して) 解析したいと考えています。たとえば、私が持っている場合:

<top-node>
    Hi
    <second-node>
        Hello
        <inner-node>
        </inner-node>
    </second-node>
    Hey
    <third-node>
       Foo
    </third-node>
    Bar
<top-node>

次の配列を取得したいと思います。

array(
    1 => 'Hi',
    2 => 'Hey',
    3 => 'Bar'
)

私は私が始めることができることを知っています

$inside = preg_match('~<(\S+).*?>(?P<inside>(.|\s)*)</\1>~', $original_text);

そして、それはテキストを取得します sans top-node. ただし、次のステップは私の正規表現の能力を少し超えています。

編集:実際には、その preg_match$original_textは、すべてが同じ行にある場合にのみ機能するように見えます。さらに、非常によく似た正規表現で a を使用して、探しているものを取得できると思いますpreg_split。複数の行で機能していません。

注: ご不明な点がございましたら、お気軽にお問い合わせください。ただし、私の質問はかなり具体的であり、私が求めていることを意味しているので、「SimpleXML を使用してください」などの答えを出さないでください。あらゆる支援に感謝します。

4

2 に答える 2

1

あなた自身のアイデアに基づいて、preg_split私が思いついたを使用して:

$raw="<top-node>
    Hi
    <second-node>
        Hello
        <inner-node>
        </inner-node>
    </second-node>
    Hey
    <third-node>
       Foo
    </third-node>
    Bar
</top-node>";

$reg='~<(\S+).*?>(.*?)</\1>~s';
preg_match_all($reg, $raw, $res);
$res = explode(chr(31), preg_replace($reg, chr(31), $res[2][0]));

chr(31) は「単位区切り文字」であることに注意してください

結果の配列を次の方法でテストします。

echo ("<xmp>start\n" . print_r($res, true) . "\nfin</xmp>");

これは 1 つのノードで機能するようで、要求した配列が得られますが、おそらくあらゆる種類の問題が発生するでしょう..返された値をトリミングすることをお勧めします。

編集:
Denomales の答えはおそらくより良いです..

于 2013-07-13T01:59:24.723 に答える