タグ
  Active Directory (51)
  ANSI (1)
  bash (1)
  BAT (14)
  bind (1)
  CentOS (3)
  CSharp (1)
  C言語 (4)
  DNS (3)
  Excel (1)
  Fedora (4)
  FreeBSD (3)
  iSCSI (1)
  Java (11)
  JavaScript (6)
  Link (4)
  Linux (15)
  Mail (1)
  Microsoft (4)
  NIS (1)
  OpenLDAP (2)
  OpenSolaris (4)
  PHP (2)
  PostgreSQL (2)
  PowerShell (33)
  RFC (3)
  Solaris (10)
  SQL Server (1)
  Ubuntu (3)
  VBScript (65)
  Visual Basic (1)
  VMware (2)
  Windows (14)
  WMI (16)
  WSF (5)
  WSH (10)
  作成中 (5)
  慣用句 (1)
  正規表現 (6)
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-2010 UPKEN