作成 2010.03.01
更新 2010.06.02
PHP で正規表現
サンプル コード
一番内側のブロック要素を取得する正規表現です。
言明 (assertion) <(?!\\1) のところがミソです。
このコードで言うと、<div>~~<div>~~</div>はマッチしませんが、<div>~~<br>~~</div>はマッチします。
(?: ... ) の部分はキャプチャの対象外になります。$matches に値として格納されません。
<?php
$str =<<<_STR_
z1<br>z1-2
<div id="a">
a1<br>a1-2
<div id="b">
b1<br>b1-2
<div id="c">c1<br>c1-2<br>
c1-3</div>
b2<br>b2-2
</div>
a2<br>a2-2
</div>
z2<br>z2-2
<div id="d">
d1-d1-2
</div>
z3<br>z3-2
_STR_;
if(preg_match_all('/<(\w+)[^>]*>([^<>]*(?:<(?!\\1)[^>]*>[^<>]*)*?)<\/\\1>/is',$str,$matches)){
  print_r($matches);
}else{
  print "Unmatch\n";
}
?>
実行結果
取得したいのは、ブロック要素全体を指している $matches[0][] と、ブロック要素の innerHTML に相当する $matches[2][] です。
ちなみに $matches[1][] に格納された値は、パターン マッチングの際に \\1 として使用された値が入ります。
Array
(
    [0] => Array
        (
            [0] => <div id="c">c1<br>c1-2<br>
c1-3</div>
            [1] => <div id="d">
d1-d1-2
</div>
        )

    [1] => Array
        (
            [0] => div
            [1] => div
        )

    [2] => Array
        (
            [0] => c1<br>c1-2<br>
c1-3
            [1] =>
d1-d1-2

        )

)
参考
タグ: PHP 正規表現

©2004-2017 UPKEN IPv4