<?

$words =<<<EOD
今までデジタル放送(地デジ等)は、
1回しかコピーが許可されておらず、
1回DVDにしたらそこで終わりだ。
ハイビジョン放送を画質が劣化するDVDにしても1回のみ。
EOD;

$o = new Chasen();
$result = $o->parse($words);
var_export($result);


/// Chasenクラス
class Chasen
{
	/// chasenのフルパス
	var $_chasen = '/usr/local/bin/chasen';
	
	/// わかち書きを取得する最短文字列
	var $_sep_len = 3;
	
	// わかち書きの種類を指定する正規表現
	var $_sep_regexp = '/名詞/';

	/// コンストラクタ
	function Chasen()
	{
	}

	function parse($str, $options = array())
	{
		$result = array();
		
		$descriptorspec = array(
		   0 => array("pipe", "r"),  // stdin は、子プロセスが読み込むパイプです。
		   1 => array("pipe", "w"),  // stdout は、子プロセスが書き込むパイプです。
		   2 => array("file", "/tmp/error-output.txt", "a") // はファイルで、そこに書き込みます。
		);

		$cwd = '/tmp';
		$env = array(
					'LANG' => 'ja_JP.eucjp'
					);
		$pipes = null;

		// 双方向パイプを開く
//		$process = proc_open($this->_chasen, $descriptorspec, $pipes, $cwd, $env); // php5
		$process = proc_open($this->_chasen, $descriptorspec, $pipes); // php4

		if (is_resource($process)) {
			// $pipes はこの時点で次のような形を取っています。
			// 0 => 子プロセスの stdin に繋がれた書き込み可能なハンドル
			// 1 => 子プロセスの stdout に繋がれた読み込み可能なハンドル
			// すべてのエラー出力は /tmp/error-output.txt に書き込みされます。

			fwrite($pipes[0], $str);
			fclose($pipes[0]);

			while (!feof($pipes[1])) {
				$buffer = fgets($pipes[1], 4096);
				if(preg_match('/^EOS/i', $match)) break;
				$aTmp = split("\t", $buffer);
				if( preg_match( $this->_sep_regexp, $aTmp[3])
					&& strlen( $aTmp[0] ) >= $this->_sep_len )
				{
					$result[$aTmp[0]]++;
				}
			}
			fclose($pipes[1]);

			// デッドロックを避けるため、proc_close を呼ぶ前に
			// すべてのパイプを閉じることが重要です。
			$return_value = proc_close($process);
		}
		
		return $result;
	}
}
