【PHP実践|実務向け】PHPで実現する、スマートな「用語自動リンク生成」の実装テクニック

1. 導入

Webサイトやブログにおいて、専門用語に解説ページへのリンクを自動で付与する機能は、ユーザービリティを高めるために非常に有効です。しかし、単純に文字列置換を行うと、「ウェブ」という単語を置換した後に「ウェブブラウザ」を置換しようとしてリンクタグが二重に壊れてしまう、あるいは意図しない部分が置換されるといった問題が発生します。本記事では、PHPを用いてこの課題をスマートに解決する方法を解説します。

2. 基礎知識

今回扱うのは、特定のキーワードを検出し、それをaタグでラップする処理です。ここで重要な概念が「置換順序」です。PHPの置換関数(strtrなど)は、指定したリストを順次処理しますが、長い単語よりも先に短い単語を置換してしまうと、長い単語の一部がすでにリンク化されてしまい、正しいHTML構造が作れません。そのため、「文字数の多い単語から順に置換する」というソートのロジックが不可欠となります。

3. 実装/解決策

実装のポイントは以下の2点です。
・置換対象の配列を、キー(単語)の文字数で降順にソートする。
・マルチバイト文字(日本語)を扱うため、strtrの挙動に注意し、環境に応じてmb_strtrなどのマルチバイト対応関数を利用する。

4. サンプルプログラム

“http://en.wikipedia.org/wiki/Web”,
“ウェブブラウザ” => “http://en.wikipedia.org/wiki/Web_browser”,
“ウェブサイト” => “http://en.wikipedia.org/wiki/Website”,
“ソフトウェア” => “http://en.wikipedia.org/wiki/Software”
];

// 1. 重要:キー(単語)の文字数が長い順にソートする
// これにより、「ウェブブラウザ」が先に置換され、誤った分割を防ぐ
uksort($wordlist, function($a, $b) {
return mb_strlen($b, ‘utf-8’) – mb_strlen($a, ‘utf-8’);
});

// 置換用のペア配列を作成(キー:単語、値:リンクタグ付き単語)
$pairs = [];
foreach ($wordlist as $word => $url) {
$pairs[$word] = ‘‘ . $word . ‘‘;
}

// 2. strtr関数で一括置換
// ※注意: 環境やPHPバージョンにより、マルチバイト文字で不具合が出る場合は
// mb_strtr等のライブラリを使用してください
$result = strtr($str, $pairs);

echo $result;
?>

5. 応用・注意点

・HTMLタグ内の誤置換に注意
上記の処理は単純な文字列置換であるため、すでにHTMLタグとして記述されている箇所や、alt属性の中身まで置換してしまうリスクがあります。本番環境で実装する場合は、DOMDocumentクラスを使用して「テキストノードのみを対象にする」といった、より堅牢な実装を推奨します。

・パフォーマンスについて
置換対象の単語数が数千件を超える場合、strtrでの置換はパフォーマンスが低下します。その場合は、正規表現(preg_replace)を使用して、単語リストをひとまとめのパターンとしてコンパイルしてから置換する方法が高速です。現場の規模感に合わせて最適な手法を選択してください。

タイトルとURLをコピーしました