[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

[PHP]画像を連結して数値を表示する

アクセスカウンター等でよく見る、数字の描かれた画像を連結して一枚の画像として表示する場合のソースです。

<?php
//カウント
$count = 12345;
//桁
$figure = 8;

//数字画像のサイズ
$width	 = 16;
$height	 = 24;

$count = sprintf("%0{$figure}d", $count);

$length = strlen($count);

$base = ImageCreateTrueColor($width * $length, $height);

for($i=0;$i<$length;$i++){
	$num = substr($count, $i, 1);
	$digit = ImageCreateFromJpeg("img/{$num}.jpg");
	ImageCopy($base, $digit, $i * $width, 0, 0, 0, $width, $height);
	imagedestroy($digit);
}

header("Content-Type: image/jpeg");
imagejpeg($base, NULL, 80);
imagedestroy($base);

counter

今回は「1.jpg」のように数字がファイル名になっている統一サイズの画像を使いました。
先頭をゼロで埋める必要がない場合は sprintf の部分を消して下さい。

画像とソース

[PHP]連続投稿を一定時間制限する(クッキーによる簡易ロック)

掲示板等で連続書き込みを簡易的に防止する場合はクッキーを使うのが簡単です。
引数は基本的に「setcookie(クッキー名, 値, 有効期限)」なので、例では有効期限を
現在時刻より300秒(5分)後にセットしてあります。
値はこの場合は何でもいいのでとりあえず「true」としておきました。

1. 書き込み前に投稿フォームのページでクッキーが利用できるかを確認するためのクッキーを発行しておく

<?php
session_start();

// ランダムな文字列を生成
$ticket = md5(uniqid(mt_rand(), true));

// 確認用チケットを発行
setcookie('cookie_ticket', $ticket);
$_SESSION['ticket'] = $ticket;

2. 投稿時にクッキーをチェックし、投稿に成功したら制限をかける

<?php
session_start();

$s_ticket = isset($_SESSION['ticket'])       ? $_SESSION['ticket']       : '';
$c_ticket = isset($_COOKIE['cookie_ticket']) ? $_COOKIE['cookie_ticket'] : '';

if( empty($s_ticket) || $s_ticket !== $c_ticket ){
  echo "クッキーを有効にして下さい";
} else if(isset($_COOKIE["cookie_post"])){
  // 制限された時の処理
  echo "連続投稿はしばらく時間をおいて下さい";
} else {
  // 投稿処理

  // 投稿が完了したら制限用のクッキーを発行する
  $expire = time() + 5 * 60;
  $value = "true";

  // このクッキーが存在する間は投稿を制限
  setcookie('cookie_post', $value, $expire);
}

// チケットを削除
$_SESSION['ticket'] = null;
unset($_SESSION['ticket']);
setcookie ("cookie_ticket", "", time() - 3600);

クッキーはブラウザから簡単に削除出来てしまうため、セキュリティ面ではほとんど意味を成しません。
厳格なロックを掛けるのであればアカウントにログインさせる方式を取る必要があります。
とはいえ、IP制限と併用するなどしてちょっとした手間をかけさせることでいたずらを防止する効果はあります。