1つだけ過去を変えられるとしたら?

次のようなHTMLで、divのclassが「a」内のdivのclassがない場合の要素(つまり下の例では、「ccc」)を
取得したいと思って、「class=''」を記述したのですが、これはマッチしませんでした・・・
かといって「//div[@class='a']」だけだと「<div class=b>」にもマッチしてしまいます。
この場合はどのような記述になるのでしょうか?_

$document =<<<EOF
<div class=a><div class=b>bbb</div><div>ccc</div></div>
EOF;

$doc = DOMDocument::loadHTML($document);
$xpath = new DOMXPath($doc);
$items = $xpath->query("//div[@class='a']/div[@class='']");
foreach ($items as $item) {
$arr[] = $item->nodeValue;
}
print_r($arr);

A 回答 (2件)

> ただqueryを使ってやった場合に、今回のようなケースでは


> みなさんはどうやって記述しているのかが知りたくて、
> 想像ですけど、たぶん今回のケースはそんなに難しい記述じゃないかと。。。

 解りました。
 queryを使ったやり方ですと、下記のように修正していただければOKです。

"//div[@class='a']/div[not(@class)]"

※ただ、書式が定まっていないHTMLの場合、正規表現の方が汎用性がある分、やりやすいと思いますよ。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
なるほど、その記述でできました。
ありがとうがございます。

お礼日時:2011/10/04 21:46

シンプルに考えて、正規表現で取り出す方法でどうでしょうか。



$document =<<<EOF
<div class=a><div class=b>bbb</div><div>ccc</div></div>
EOF;

// 正規表現で取り出し
preg_match( '/<div class=a>.+?<div>(.+?)<\/div>/', $document, $match );
echo $match[ 1 ];
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
なるほど、たしかにこのやり方でできました。
ありがとうございます。
ただqueryを使ってやった場合に、今回のようなケースでは
みなさんはどうやって記述しているのかが知りたくて、
想像ですけど、たぶん今回のケースはそんなに難しい記述じゃないかと。。。
ただそれでも自分は分からないですけど・・・

お礼日時:2011/10/04 12:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報