質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
DOM

DOMは、Document Object Modelの略で、HTML文書やXML文書をアプリケーションから利用するためのAPIです。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

588閲覧

DOMDocumentによるHTMLの書き換えについて

akitasoran

総合スコア20

DOM

DOMは、Document Object Modelの略で、HTML文書やXML文書をアプリケーションから利用するためのAPIです。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/01/31 17:07

WordPressで記事の本文を取得しツールチップを表示させるためHTMLの書き換えを行うプログラムを書いているのですが、単純にstr_replace関数を使うと置換させたくない箇所(HTMLの属性値など)も置換されてしまいます。

そこでDOM操作でtextContent部分を取得し書き換える方法にし説明文を加えた要素を作ることはできたのですが、置き換えるやり方がわかりません。

最後に記述しているプログラムだと文の一番最後にツールチップが表示される状態です。

appendChildが末尾に追加することが原因なのはわかっています。

PHP

1<dd>数値を 素因数分解 した値を格納した配列を返します。<span class="tooltip" aria-label="ある正の整数を素数の積の形で表すこと">素因数分解</span></dd>

本当は以下のように書き換わって欲しいです。

PHP

1<dd>数値を <span class="tooltip" aria-label="ある正の整数を素数の積の形で表すこと">素因数分解</span> した値を格納した配列を返します。</dd>

"glossary"というデータベースに単語(name)と説明文(description)が登録されていて、ツールチップは以下のHTMLで表示されるようになっています。

HTML

1<span class="tooltip" aria-label="【説明文】">【単語】</span>

また書き換えを行いたい要素は現時点で「$xpath->query('//dd');」としていますが、実際にはCSSセレクタで記述すると「div.highlightjs pre code」以外の要素(textContent)にしたいです。

querySelectorAllで要素を絞ってみたのですがエラーとなってしまいました。

色々と調べながら修正してきたのですが、自力ではここまでが限界です。

回答よろしくお願いします。

PHP

1add_filter('the_content', function($content){ 2 $content = tooltip($content); 3 return $content; 4}, 11); 5 6function tooltip($content){ 7 global $wpdb; 8 $dom = new DOMDocument(); 9 @$dom -> loadHTML('<!DOCTYPE html><html lang="ja"><head><meta charset="utf-8"><title></title></head><body>' . $content . '</body></html>'); 10 // 11 $sql = 'SELECT name, description FROM glossary;'; 12 $rows = $wpdb -> get_results($sql, ARRAY_A); 13 foreach($rows as $row){ 14 $xpath = new DOMXpath($dom); 15 $nodes = $xpath->query('//dd'); 16 foreach($nodes as $node){ 17 if(preg_match("/\s" . $row["name"] . "\s/i", $node -> nodeValue)){ 18 $span = $dom -> createElement("span"); 19 $span -> textContent = $row["name"]; 20 $span -> setAttribute("class", "tooltip"); 21 $span -> setAttribute("aria-label", $row["description"]); 22 $node -> appendChild($span); 23 } 24 } 25 } 26 return $dom -> saveHTML(); 27}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2022/02/01 00:14

jsで処理したいのですか?php側ですか? キーワードは任意に指定するのでしょうか? データベースから自動で探すのでしょうか?
guest

回答1

0

ベストアンサー

テキストをキーワードで区切って、各々キーワードは件の要素ノード、
それ以外はテキストノードにして順次appendChildした要素で置き換え

投稿2022/02/01 03:46

KazuhiroHatano

総合スコア7804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問