【WordPress】「記事内にあるタグをハイパーリンク化」否定先読みで実装

徒然草2.0

以前からこの実験ぶろぐ(現在の名前はごみぶろぐ)では、タグをつかってハイパーリンクを作りコテーページと関連付けるということで、はてなダイアリーのようなページを作れるようにしている。

(参考:https://wp.me/paqxef-39f

ただしこれだとハイパーリンク内の文字列も変換してしまう。理想を言えばハイパーリンク内(aタグに囲われている文字列)を変換対象にしないことが理想である。

ハイパーリンク内であることを正規表現で判別できなくはないが、別の問題が発生しそうな気がしているのでやらないでいる。

1つボトルネックになる懸念として、ブログ出力時に変換処理をかけているため、変換スピードを高速化かつ軽量にしたい。時間的に妥協できるスピードはどんなに長くても1秒で、できれば体感的な遅延は0にしたい。コンマ3秒以内ぐらいが妥協点だろう。ということであらかじめリンクさせたくない文字にはなにか記号のようなもの(ここでは*(アスタリスク))をつけて対象外文字を作ることにした。つまりは運用でカバー。

処理の結果を具体的に言えば「ソクラテスという文字はハイパーリンク化するが、ソクラテス*という文字はハイパーリンク化しない」ということを実現した↓str_ireplaceという完全一致の文字を変換するお手軽かつわかりやすい関数があったがpregによる先読み否定を使用した。先読み肯定だとイタチごっこになる気がするので先読み否定で置き換えるのが無難だろう。

<?php
// WordPressのタグ(文字)変換の実験

$text = "ソクラテスの哲学。ソクラテス*は無知の知を説いた。プラトンはソクラテスの弟子である。\n";
$result = "";

// $result = str_ireplace("ソクラテス", "「ソクラテス」", $text);
$result = preg_replace("/(ソクラテス)(?!\*)/i", "「ソクラテス」", $text);

echo $result;
// 「ソクラテス」の哲学。ソクラテス*は無知の知を説いた。プラトンは「ソクラテス」の弟子である。

…というわけで、なんでこんな実装したのだっけ?と、後でよくわからなくなるので理由について書いておいた。

徒然草2.0
スポンサーリンク
シェアする
gomiryoをフォローする
ごみぶろぐ

コメント

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