(3)读取词库

这个类的主要作用是解析出单词和对应的翻译,划分单词分类的不包含在这个类里


OfileName=mb_convert_encoding(trim($fname), 'GB2312', $encode);

		$temp=file_get_contents($this->OfileName, false, null, 0, 64);
		$this->ODicEncoding=mb_detect_encoding($temp, array('GB2312','GBK','UTF-8','BIG5','LATIN1'));
		
	}
	
	//读取文件并保存到$OfileName中
	protected function readDicFromFile()
	{
		if(!file_exists($this->OfileName))
		{
			die('文件不存在'.__LINE__);
		}
		if(!is_readable($this->OfileName))
		{
			die('文件不可读'.__LINE__);
		}
		$fp=fopen($this->OfileName, 'r') or die('打开文件失败'.__LINE__);
		
		while(!feof($fp))
		{
			$this->ODicString .= fread($fp, 10240);
		}
		fclose($fp);
		if(strtoupper($this->ODicEncoding)!='UTF-8')
		{
			$this->ODicString=mb_convert_encoding($this->ODicString, 'UTF-8', $this->ODicEncoding);
		}
		
	}
	//根据音标进行分割并保存到ODicUnit单元中,保存为数组
	protected  function splitWithVoice($pattern='#(?<=\r\n)/[^/]+?/(?=\s)#ui')
	{
		$this->ODicUnit=preg_split($pattern, $this->ODicString);
	}
	//从第二个到倒数第二个单元里面,保存的都是上一个单词的翻译,和下一个单词
	//根据音标分割成单元后,第一个单元里保存的是第一个单词,最后一个单元里则保存的是最后一个翻译
	//并且单词是结尾,单词和上一个单词的翻译之间肯定是存在回车换行符的,根据这个特征,提取出单词
	//所以依次从第二个单元到倒数第二个单元里,根据特征提取出单词。
	protected  function grepWord()
	{
		//提取首单词
		$this->ODicWord[]=trim(strtolower($this->ODicUnit[0]));
		
		$pat='#\r\n(.*)(?:\r\n)$#i'; //提取单词
		$len=count($this->ODicUnit);
		
		for($i=1; $i<$len-1; $i++)
		{
			if(preg_match($pat, $this->ODicUnit[$i], $match))
			{
				$this->ODicWord[]=trim(strtolower($match[1]));
			}
			else
			{
				die('匹配单词失败'.__LINE__."
"); } } } //从第二个到倒数第二个单元里面,保存的都是上一个单词的翻译,和下一个单词 //根据音标分割成单元后,第一个单元里保存的是第一个单词,最后一个单元里则保存的是最后一个翻译 //在每个单元中反向搜索单词第一次出现的位置,根据这个位置可以提取出上一个单词的翻译 protected function grepTrans() { $len=count($this->ODicUnit); for($i=1; $i<$len-1; $i++) { if($pos=strripos($this->ODicUnit[$i], $this->ODicWord[$i])) { array_push($this->ODicTrans,substr($this->ODicUnit[$i], 0, $pos)); } else { die("此方法不可行".__LINE__."
"); } } array_push($this->ODicTrans,$this->ODicUnit[$len-1]); } public function oxf() { $this->readDicFromFile(); $this->splitWithVoice(); $this->grepWord(); $this->grepTrans(); $len=count($this->ODicWord); $oxfWord=array(); for($i=0; $i<$len; $i++) { $oxfWord[$this->ODicWord[$i]] = $this->ODicTrans[$i]; //echo $this->ODicWord[$i]."
"; } return $oxfWord; //return $this->ODicUnit; } }//class Oxford /* $oxf=new Oxford(' E:/CodeEdit/php/ciba/TXT格式的牛津电子词典/牛津电子词典/A/A-c.txt '); $res=$oxf->oxf(); echo count($res)."

"; echo "
";
print_r($res); */


你可能感兴趣的:(php英汉词典,redis,分组采集,分离词条和翻译,高速缓存,php英汉词典)