SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Zend Framework入門

PHPアプリからCSSセレクタでHTML/XML文書を解析する - Zend_Dom -

Zend Frameworkによる実践的なPHPアプリケーション開発 22

文書の読み込み

 解析対象の文書の指定するには 2つの方法があります。1つ目の方法はリスト1のようにsetDocument系のメソッドを使う方法で、もう一つはコンストラクタで指定する方法です(リスト2)。

[リスト2]解析対象の文書の指定
...
//$doc には HTML文書が格納されているとする
//下の 3つはすべて同じ

//(1)インスタンスの作成時に
$zend_dom_query1 = new Zend_Dom_Query($doc);

//(2)自動的に判別
$zend_dom_query2 = new Zend_Dom_Query();
$zend_dom_query2->setDocument($doc)

//(3)HTML文書と指定
$zend_dom_query3 = new Zend_Dom_Query();
$zend_dom_query3->setDocumentHtml($html_doc)

 このうち、setDocument系のメソッドを利用して文書を指定する方法には文書の種類を自動的に判別する方法(リスト2の(2))と、文書の種類を明示的に指定する方法(リスト2の(3))の2つがあります。XMLとして文書を読み込む場合にはXMLとして妥当でない文書を指定した場合には解析の段階で失敗します。一方でHTML文書の場合は、HTMLとしての妥当性はチェックしません。

 通常の利用では自動判別の関数で十分だと思いますが、判別に失敗する場合や、XMLとして妥当でない文書を無理矢理読み込ませたい場合には明示的に文書の種類を指定するメソッドを利用する必要があります(後者の場合にはsetDocumentHtmlメソッドを利用)。

文書の種類の自動判別

 コンストラクタを利用したり、setDocumentメソッドを利用したりした場合は、文書の種類は自動的に判別されます。では、これはどう行われているのでしょう?

 

 この仕組みは非常に簡単で、setDocumentメソッド内で、

  • 「<?xml」からはじまる文書であれば XML文書
  • それ以外で「DTD XHTML」という文字列が含まれる文書であればXHTML文書
  • それ以外の場合はHTML文書

 のように判別されます。

 

 ちなみに、XHTML文書とHTML文書はほぼ同じように処理されます。

文字コード

 このようなモジュールを利用する上でよく問題になるのが文字コードですが、Zend_Dom_Queryではどのように処理しているのでしょうか? 結論を先に述べると「きちんと作法に従った文書」に対しては「文字コードを自動的に判別」してくれます。

 きちんと作法に従っている例をリスト3に示します。

[リスト3]文字コードの指定
//(1)HTML文書の場合(サンプルのzend_dom.php より)
...
$doc = <<<EOF
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
...

//(2)XML文書の場合(サンプルのxml.php より)
...
$doc = <<<EOF
<?xml version="1.0" encoding="UTF-8"?>
<bookList>
...

 このように、HTMLの場合にはmetaタグで(リスト3の(1))、XMLの場合には先頭の宣言で(リスト3の(2))文字コードが正しく宣言されている文書については自動的に文字コードを判別して正しく処理してくれます。

 逆に、このような宣言がない文書については文字コードを正しく判別してくれません(デフォルトではヨーロッパ言語の文字列として処理されてしまうようです)。日本語が含まれた文書について、クエリがうまく行かなかったり、文字化けをしてしまう場合には文字コードを疑ってみると良いでしょう。

次のページ
クエリの実行

この記事は参考になりましたか?

Zend Framework入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 風田 伸之(カゼタ ノブユキ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4162 2009/08/07 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー