PHP での HTML/XML 解析・処理
PHP で HTML/XML を解析・処理する方法
PHP では、HTML や XML の解析・処理を行うために、主に以下の方法が利用されます。
DOM (Document Object Model) を利用する
DOM は、HTML や XML をツリー構造で表現するモデルです。PHP では、DOM Extension を使用することで、HTML や XML の要素、属性、テキストなどを操作することができます。
<?php
$doc = new DOMDocument();
$doc->loadHTML('<!DOCTYPE html><html><head><title>Example</title></head><body><p>This is a paragraph.</p></body></html>');
// 要素を取得
$p = $doc->getElementsByTagName('p')->item(0);
// 要素のテキストを変更
$p->nodeValue = 'This is a modified paragraph.';
// HTMLを出力
echo $doc->saveHTML();
?>
SimpleXML を利用する
SimpleXML は、DOM よりもシンプルで使いやすいインターフェースを提供します。HTML や XML をオブジェクトとして扱えるため、直感的な操作が可能です。
<?php
$xml = simplexml_load_string('<book><title>Example</title><author>John Doe</author></book>');
// 要素の値を取得
echo $xml->title; // Output: Example
// 要素を追加
$xml->price = 19.99;
// XMLを出力
echo $xml->asXML();
?>
Regular Expressions を利用する
Regular Expressions を使用して、HTML や XML の特定のパターンをマッチングし、解析することができます。ただし、複雑な構造の文書を処理する場合には、DOM や SimpleXML を利用する方が適しています。
<?php
$html = '<p>This is a paragraph.</p>';
// 正規表現でマッチング
preg_match('/<p>(.*?)<\/p>/', $html, $matches);
// マッチした内容を取得
echo $matches[1]; // Output: This is a paragraph.
?>
注意
- Regular Expressions は、複雑なパターンをマッチングする場合には、可読性が低下することがあります。適切なバランスを考慮して使用してください。
- DOM や SimpleXML の性能は、文書のサイズや複雑さに依存します。大規模な文書を処理する場合には、パフォーマンスに注意が必要です。
- HTML や XML の解析・処理には、セキュリティ上のリスクが存在します。クロスサイトスクリプティング (XSS) やインジェクション攻撃などを防ぐために、適切な対策を講じる必要があります。
DOM を利用するコード解説
<?php
$doc = new DOMDocument();
$doc->loadHTML('<!DOCTYPE html><html><head><title>Example</title></head><body><p>This is a paragraph.</p></body></html>');
// 要素を取得
$p = $doc->getElementsByTagName('p')->item(0);
// 要素のテキストを変更
$p->nodeValue = 'This is a modified paragraph.';
// HTMLを出力
echo $doc->saveHTML();
?>
- saveHTML()
DOMDocument オブジェクトを HTML 文字列として出力します。 - nodeValue
要素のテキストノードの値を設定します。 - item(0)
リストの最初の要素を取得します。 - getElementsByTagName()
指定されたタグ名を持つ要素のリストを取得します。 - loadHTML()
指定された HTML 文字列を DOMDocument オブジェクトに読み込みます。 - new DOMDocument()
DOMDocument オブジェクトを作成します。
<?php
$xml = simplexml_load_string('<book><title>Example</title><author>John Doe</author></book>');
// 要素の値を取得
echo $xml->title; // Output: Example
// 要素を追加
$xml->price = 19.99;
// XMLを出力
echo $xml->asXML();
?>
- asXML()
SimpleXMLElement オブジェクトを XML 文字列として出力します。 - ->
オブジェクトのプロパティにアクセスします。 - simplexml_load_string()
指定された XML 文字列を SimpleXMLElement オブジェクトに変換します。
<?php
$html = '<p>This is a paragraph.</p>';
// 正規表現でマッチング
preg_match('/<p>(.*?)<\/p>/', $html, $matches);
// マッチした内容を取得
echo $matches[1]; // Output: This is a paragraph.
?>
- $matches
マッチした部分文字列を格納する配列です。 - '/<p>(.*?)<\/p>/'
<p>
タグと</p>
タグの間のテキストをキャプチャする正規表現パターンです。 - preg_match()
正規表現パターンを文字列にマッチングします。
HTML Purifier
<?php
require 'HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$dirty_html = '<script>alert("XSS!");</script>';
$clean_html = $purifier->purify($dirty_html);
echo $clean_html; // Output: <script>alert("XSS!");</script>
?>
DOMDocument の XPath
DOMDocument の XPath を使用することで、HTML や XML の要素をより柔軟に検索・操作することができます。XPath は、XML のパスを指定する言語であり、DOMDocument オブジェクトから XPath を使用して要素を取得することができます。
<?php
$doc = new DOMDocument();
$doc->loadHTML('<!DOCTYPE html><html><head><title>Example</title></head><body><p>This is a paragraph.</p></body></html>');
// XPathで要素を取得
$p = $doc->getElementsByTagName('p')->item(0);
$xpath = new DOMXPath($doc);
$result = $xpath->query('/html/body/p');
// 要素のテキストを変更
$result->item(0)->nodeValue = 'This is a modified paragraph.';
// HTMLを出力
echo $doc->saveHTML();
?>
PHP Parser
PHP Parser は、PHP コードを解析するためのライブラリです。HTML や XML の解析には直接使用できませんが、PHP コードを解析して、HTML や XML の生成や操作を行うことができます。
<?php
require 'vendor/autoload.php';
use PhpParser\Parser;
use PhpParser\Node;
use PhpParser\NodeVisitorAbstract;
$parser = new Parser();
$traverser = new NodeVisitorAbstract();
$code = '<?php echo "<p>This is a paragraph.</p>"; ?>';
$ast = $parser->parse($code);
$traverser->beforeTraverse($ast);
// ASTを解析してHTMLを生成
// ...
?>
php html xml