文字列置換を行うための正規表現と DOM パーサー – Snow Monkey カスタマイズ

本記事は、Snow Monkey カスタマイズを行う際のDOM パーサーのことを書いています。

最初に

Snow Monkey のテーマをカスタマイズする際に、HTML 記述を置換する場合は、正規表現で文字列置換をすることが多いです。しかし、正規表現で正しく置換することが苦労する場合もあるでしょう。

Snow Monkey のテーマをカスタマイズする際の 置換するHTML 記述の中に </div> タグがいくつも記述されていたり、変更したい箇所のDOMを正規表現で正しく置換することが難しい場合はどのようにすれば良いでしょうか?

文字列置換には、DOM パーサーを使う選択もある

その為、PHPライブラリを使用し、置換前の $htmlDOM Parser などを用いて判定する手法を行う方が、楽に実装できる場合があります。

しかし、テーマカスタマイズに対して、そのような DOM パーサーなどのHTML文法を解析する重い処理をする PHPライブラリを使うのは、ページ全体の表示速度の低下につながることでしょう。可能な限り、そう言った思い処理を行う PHPライブラリは使用せずに、標準の PHP で用意されている関数をそのまま用いて実装する方が良いでしょう。

Snow Monkey のカスタマイズでも、DOMパースをしてみる

PHPライブラリを使用せず、Snow Monkey のカスタマイズで DOMパースを行う場合、PHPの標準関数である DOM 関数を使用して DOMパースを行うのが、ページの表示速度をあまり落とさないので良いと考えています。
その DOM 関数を使用した HTML 文字列置換の基礎を解説します。

ここでは、DOM 関数の説明は簡易的なものに留めます。DOM 関数の詳細については下記のページをご参照ください。

Document Object Model – php.net

試しに \Framework\Helper::get_template_part 関数を使用してテンプレートパーツを取得し、特定のdiv要素の削除を行なってみましょう。

add_filter( 'snow_monkey_template_part_render', 'sm_template_part_render', 10, 4 );

function sm_template_part_render( $html, $slug, $name, $vars ) {
	if ( 'template-parts/common/profile-box' === $slug ) {
		$domDocument = new DOMDocument();
		@$domDocument->loadHTML( $html );
		$xPath = new DOMXPath( $domDocument );
		foreach ( $xPath->query( '//a[@class="wp-profile-box__archives-btn"]' ) as $node ) {
			$node->nodeValue = null;
		}
		$html = $domDocument->saveHTML();
	}
	return $html;
}

上記のように記述後、確認してみてください。「この記事を書いた人」の「記事一覧」のリンクが、表示されなく(削除)なるでしょう。
PHP の DOMDocument 関数や DOMXPath 関数を使用し、class="wp-profile-box__archives-btn" がある a タグ の DOMNode を削除したからです。

テネーブル

このように </a> などの閉じタグが複数入る可能性のあるテンプレートパーツでは DOM 関数を使用してその DOMNode だけを削除する方法を使うことで、安全にリンクを取り除くことも可能です。

ルミェール

正規表現で </a> までを置換しようとすると別の</a>までを対象にして変なリンクになっちゃうこともある。そんな時に DOM パースを使うと簡単にできるね!

最後に

ケミ

PHP 標準の DOM 関数は、情報も少なく慣れていない場合には難しいでしょう。「慣れていないけど、どうしてもDOM操作をしたい」と言う方は、若干のページ表示速度の低下を考えた上で PHPライブラリも試しに使ってみるのが良いでしょう。PHP Simple HTML DOM Parser と言った PHPライブラリは、HTML構文解析が非常に遅いのでオススメできませんが、Goutte と言った PHPライブラリであれば、PHP標準の DOM 関数を内部で使用しています。

そちらは、やり方次第で速度の低下を許容範囲内にできる場合もあります。

お試しください。

この記事の筆者

Kmix39(ケミ)

電子の妖精。当ウェブサイトの記事制作などを行なっています。
金融・不動産・医療・教育などの数々の業種のシステム開発を経験を積み、スマートフォンアプリケーションと WordPress などのウェブアプリケーションを日々勉強中。