文字のピクセル幅を取得する。

かなりやっつけ。
フォントは何か知らんけどS-JISなら幅は合うだろし

class charWidth {

	const SPACE_WIDTH = 11;

	static public function getCharWidth($char) {
		// "auto" -> "SJIS"?
		$char = mb_convert_encoding($char, "UTF8", "auto");
		//if(preg_match('/[一-龠]{1}|[ぁ-ん]{1}|[ァ-ヴー]{1}|[a-zA-Z0-9]{1}/u', $this->char) {
		if(preg_match('/[.,:;\'il]{1}/', $char)) {
			return 3;
		}
		if(preg_match('/[|!{}jjiIl゚゙]{1}/u', $char)) {
			return 4;
		}
		if(preg_match('/[ ()\[\]_fft]{1}/u', $char)) {
			return 5;
		}
		if(preg_match('/[rrt]{1}/u', $char)) {
			return 6;
		}
		if(preg_match('/[`~^s?、。gkxz「」・ィョトミ]{1}/u', $char)) {
			return 7;
		}
		if(preg_match('/[”¨()=+-<>‘’・:;゛゜`´〔〕[]{}456\/\*]{1}/u', $char)) {
			return 8;
		}
		if(preg_match('/[‡〈〉《》「」『』【】†¶\"#$%^ァゥェォャュッ789]{1}/u', $char)) {
			return 8;
		}
		if(preg_match('/[abcdehnopquvyvxyzノヒメヨリ0123‐]{1}/u', $char)) {
			return 8;
		}
		if(preg_match('/[EFJLTYZヲイカクコシソタヌフラレロワンacegsく]{1}/u', $char)) {
			return 9;
		}
		if(preg_match('/[ABDHKNPRSUVX&ーアウエオキケスセチツテナニネ]{1}/u', $char)) {
			return 10;
		}
		if(preg_match('/[ヘホマモユFJLTXYZbdhknopquwぅィトョ]{1}/u', $char)) {
			return 10;
		}
		if(preg_match('/[@CGOQサムヤル、。,.ゞ01234567890AE PVうドノミ]{1}/u', $char)) {
			return 11;
		}
		if(preg_match('/[MWmヽヾゝBCDGHKNRSUwさしじとりぁぇょァゥェッタヒヨリヵヶヮ]{1}/u', $char)) {
			return 12;
		}
		if(preg_match('/[OQぃぉっぐこもらォャュイカクコソヌフラヲ]{1}/u', $char)) {
			return 13;
		}
		if(preg_match('/[えきぎござちぢてでどなまよるろをゃゅゎアエゴシジスゾツテビピブプマモレロン]{1}/u', $char)) {
			return 14;
		}
		if(preg_match('/[ーMmあいおけすそぞただつづにひびぴんウオガギググケゲセダズチヂヅデナニネヘベペホボポユワヴ]{1}/u', $char)) {
			return 15;
		}
		// それ以外
		return 16;
		
		// それ以外
		if(preg_match('/[一-龠]{1}/u', $char)) {
			return 16;
		}
	}

	static public function getStringWidth($string) {
		$length = 0;
		for($i=mb_strlen($string)-1; 0<=$i; --$i) {
			$length += CharWidth::getCharWidth(mb_substr($string, $i, 1));
			//print($length."<br>\n");
		}
		return $length;
	}
}