[PHP]文章中の単語に自動でリンクを貼る(キーワードリンク)

よくコンピュータ系のサイトで専門用語に解説ページへのリンクが貼られているのを見かけますが、構造的には単語と URL を用意しておき、当てはまる単語にリンクを貼るというものです。

単純に組むとすでに置換した単語を二重に置換してしまうので、少し工夫が必要になります。

<?php
//元となる文章
$str = "ウェブブラウザとはウェブサイトを閲覧するためのソフトウェアです";
 
//単語とURLのリスト
$wordlist = array(
  "ウェブ" => "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"
);
 
//単語の文字数が長いものから順に並べ替える
uksort($wordlist, function($a, $b){
	return mb_strlen($b, 'utf-8') - mb_strlen($a, 'utf-8'); });

$pairs = array();

foreach($wordlist as $word => $url){
	$pairs[$word] = '<a href="' . $url . '">' . $word . '</a>';
}

$str = strtr($str, $pairs);
echo $str;

今回は「ウェブブラウザとはウェブサイトを閲覧するためのソフトウェアです」という文の用語にリンクをつけています。
単語は配列に $wordlist 登録し、キーが対象語句、値がリンク先です。

途中文字の長い順に単語を並び替えていますが、そうしておかないと「ウェブブラウザ」を置換するより先に「ウェブ」だけが置換され、「ブラウザ」の文字が取り残されてしまうからです。


(2014/05/07 加筆)

コメントで教えていただきましたが strtr は基本的にマルチバイト非対応の関数のため、文字コードによっては誤作動を起こす場合があるようです。
その場合は以下のマルチバイト対応版 mb_strtr() を使うことをおすすめします。

参考: 「マルチバイト未対応の関数をいろいろ対応させてみた」
http://qiita.com/mpyw/items/ceae0ed5285093c76087#2-7

さくらのドメインからムームードメインに移管

先日さくらのドメインで取得したドメイン(gLTD)をムームードメインに移管したので
まとめておきます。

まずさくらインターネットにドメイン転出を依頼します。
会員メニューにログインし、「サポート→メールでのお問い合わせ」に行き、
「サービス名称」を「ドメイン取得」、「お問い合わせの種類」を「gLTDドメイン移管(転出)依頼」にして、
現れるフォームに記入します。
1~3日くらいでオースコードとレジストリキーがメールで送られてきます。

次はムームードメインに移り、「移管→レジストラ移管申請」を選択し、フォームを埋めていきます。
数日以内に「トランスファー承認手続きのお願い」がメールで届くので、
それに書かれているアドレスに移動し「承認する」ボタンを押します。

私の場合はここから6日程で移管が完了しました。
移管の際DNS設定もそのまま引き継がれるのでサイトが見られなくなることはありませんでした。
入金さえしっかり済ませれば他に何もする必要なく移管することができました。

[PHP]クラスの基礎 メンバ変数とメンバ関数

大規模なPHPプログラムでは必須になってくる Class なのですが、
今ひとつピンとこないので基礎からおさらいしてみようと思います。

クラスはプロパティ(メンバ変数)とメソッド(メンバ関数)を持ち、
複数の関数をひとつのグループにまとめることができます。

メンバ変数はクラス内のメンバ関数で共有して利用できる変数で、
アクセス権によって3種類に分類されます。

「public」はクラスの中でも外でも利用できます。
具体的には下記のように使います。

<?php
class Test{
    public $foo = 123;
}

$test = new Test();
echo $test->foo;

「private」はそのクラス内でしか利用できません。
上のソースの public を private に変えてみるとエラーが出るのがわかります。
private は次のように用います。

<?php
class Test{
    private $foo = 123;

    function abc(){
        echo $this->foo;
    }
}

$test = new Test();
$test->abc();

「$this」って何?と思われるかもしれませんが、これはオブジェクト自身を指す変数です。
「echo $foo;」のようにはできないので気をつけて下さい。

3つ目は「protected」です。
こちらもクラス内でしか使えませんが、継承した子クラスからはアクセスできる権限です。

<?php
class Test{
  protected $foo = 123;
}

class Example extends Test {
  function abc(){
    echo $this->foo;
  }
}

$example = new Example();
$example->abc();

子クラスは「class 子クラス名 extends 親クラス {}」の形で定義します
子クラスは親クラスのすべてのメソッドを受け継ぐ(継承)ので、子クラスの中でも
親クラスで定義したメソッドを利用できます。

「protected」は子クラスからでもアクセスできるのに対して、
「private」はそのクラス内でしか利用できないので、上のソースを「private」に
書き換えるとエラーが発生します。