完善的汉字转拼音php转换类

 更新时间:2016年11月25日 17:32  点击:1824

办法是利用矩阵,汉字的组成方式是两个ascii字符,一个高位码,一个低位码,界限分别是128-264 64-128
每个汉字拼音最长为8个字符,由此组成二维矩阵进行查询,弊端是无法解决多音字问题

class pinyin{

/*
是否将拼音文件读取到内存内,损耗少许内存,几百kb的样子,速度可以略有提升,
*/
var $ismemorycache = 1;

/*
是否只获取首字母
*/
var $isfrist = 1;

/*
拼音矩阵文件地址
*/
var $path = "py.qdb";

/*
内存拼音矩阵
*/
var $memorycache;

/*
拼音文件句柄
*/
var $handle;

/*
转换发生错误盒子
*/
var $errormsgbox;

/*
转换结果
*/
var $result;


var $array = array();
var $n_t = array("ā" => "a","á" => "a","ǎ" => "a","à" => "a","ɑ" => "a",
"ō" => "o","ó" => "o","ǒ" => "o","ò" => "o",
"ē" => "e","é" => "e","ě" => "e","è" => "e","ê" => "e",
"ī" => "i","í" => "i","ǐ" => "i","ì" => "i",
"ū" => "u","ú" => "u","ǔ" => "u","ù" => "u",
"ǖ" => "v","ǘ" => "v","ǚ" => "v","ǜ" => "v","ü" => "v"
);

/*
转换入口
@params $str 所需转换字符,$istonemark 是否保留音标 $suffix 尾缀,默认为空格
*/
function chinesetopinyin($str,$istonemark = 0,$suffix = ""){
$this->py($str,$istonemark,$suffix);
return $this -> result;
}

function get(){
return $this -> result;
}


function py($str,$n = 0,$s = ""){
$strlength = strlen($str);
if($strlength == 0){ return ""; }
$this->result = "";
if(is_array($str)){
foreach($str as $key => $val){
$str[$key] = $this->py($val,$n,$s);
}
return;
}

if(empty($this->handle)){
if(!file_exists($this->path)){
$this->addoneerrormsg(1,"拼音文件路径不存在");
return false;

}

if(is_array($str)){
foreach($str as $key => $val){
$str[$key] = $this->py($val,$n,$s);
}
}


if($this -> ismemorycache){
if(!$this->memorycache){
$this->memorycache = file_get_contents($this->path);
for($i = 0 ; $i < $strlength ; $i++){
$ord1 = ord(substr($str,$i,1));
if($ord1 > 128){
$ord2 = ord(substr($str, ++$i, 1));
if(!isset($this->array[$ord1][$ord2])){
$leng = ($ord1 - 129) * ((254 - 63) * 8 + 2) + ($ord2 - 64) * 8;
$this->array[$ord1][$ord2] = trim(substr($this->memorycache,$leng,8));
}
$strtrlen = $this->isfrist ? 1 : 8;
$this->result .= substr($this ->array[$ord1][$ord2],0,$strtrlen).$s;
}else{
$this->result .= substr($str,$i,1);
}

}
}
}else{
$this->handle = fopen($this->path,"r");
for($i = 0 ; $i < $strlength ; $i++){
$ord1 = ord(substr($str,$i,1));
if($ord1 > 128){
$ord2 = ord(substr($str, ++$i, 1));
if(!isset($this->array[$ord1][$ord2])){
$leng = ($ord1 - 129) * ((254 - 63) * 8 + 2) + ($ord2 - 64) * 8;
fseek($this -> handle,$leng);
$this->array[$ord1][$ord2] = trim(fgets($this->handle,8));

}
$strtrlen = $this->isfrist ? 1 : 8;

$this->result .= substr($this ->array[$ord1][$ord2],0,$strtrlen).$s;
}else{ $this->result .= substr($str,$i,1); }

}
}

if(!$n){ $this -> result = strtr($this -> result,$this -> n_t);}
}
}
function addoneerrormsg($no,$reason){

$this->errormsgbox[] = "<b>error:</b>" . $no . "," . $reason;
}

function showerrormsg(){

foreach($this->errormsgbox as $val){
echo $val."rnrn</br></br>";
}
}

function __destruct(){
if(is_array($this->errormsgbox)){
$this->showerrormsg();
}
}

}

之前遇见过这个难题,发现流传的代码都不怎么完善,汉字库总共有20k+的汉字,大多数的是拿几百个常用汉字打算糊弄过去,在火星文流传的今天,是不行的。
还有种读取词典然后转换的,每行一个汉字|拼音,这种弊端非常大,速度慢,耗费巨大内存,仅仅explode一下读入数组,再循环一次,就能耗费上百m的内存,如果一个单页面耗费上百m,负载稍微大点只能泪奔了。

根据需求我们写了一款利用php教程来生成迅雷 快车 旋风三种下载软件地址,他们大概都是用到了base64加密程序来实现,代码如下。

<?php
function zhuanhuan() {
$urlodd=explode('//',$_get["url"],2);//把链接分成2段,//前面是第一段,后面的是第二段
$head=strtolower($urlodd[0]);//php对大小写敏感,先统一转换成小写,不然 出现http:或者thunder:这种怪异的写法不好处理
$behind=$urlodd[1];
if($head=="thunder:"){
$url=substr(base64_decode($behind), 2, -2);//base64解密,去掉前面的aa和后面zz
}elseif($head=="flashget:"){
$url1=explode('&',$behind,2);
$url=substr(base64_decode($url1[0]), 10, -10);//base64解密,去掉前面后的[flashget]
}elseif($head=="qqdl:"){
$url=base64_decode($behind);//base64解密
}elseif($head=="http:"||$head=="ftp:"||$head=="mms:"||$head=="rtsp:"||$head=="https教程:"){
$url=$_get["url"];//常规地址仅支持http,https,ftp,mms,rtsp传输协议,其他地貌似很少,像xx网盘实际上也是基于base64,但是有的解密了也下载不了
}else{
echo "本页面暂时不支持此协议";
}
return $url;
}
if($_get["url"]!=null){
$url=zhuanhuan($_get["url"]);
$url_thunder="thunder://".base64_encode("aa".$url."zz");//base64加密,下面的2也一样
$url_flashget="flashget://".base64_encode("[flashget]".$url."[flashget]")."&aiyh";
$url_qqdl="qqdl://".base64_encode($url);
}
?>
<form action=cs.php method=get>
www.111cn.net 请输入普通链接或者迅雷,快车,旋风链地址:
<input type=text name="url" size="80">
<input type=submit value="转换">
</form>
<p>实际地址:<a href="<?php echo $url;?>" target="_blank"><?php echo $url;?></a>
<p>迅雷链:<a href="<?php echo $url_thunder;?>" target="_blank"><?php echo $url_thunder;?></a>
<p>快车链:<a href="<?php echo $url_flashget;?>" target="_blank"><?php echo $url_flashget;?></a>
<p>旋风链:<a href="<?php echo $url_qqdl;?>" target="_blank"><?php echo $url_qqdl;?></a>

php教程 preg_match_all正则匹配字符串所有连接地址
*/

$str ='<a href="http://www.a.com/2010/11-15/5.html">4</a>
  <a href="http://www.b.com/2010/11-15/6.html">5</a>
  <a href="http://www.b.com/2010/11-15/1.html">6</a>


  ';

$ymd=date("y")."/".date("m-d");
$b = preg_match_all('/<a href="(.*?)com/'.$ymd.'(.*?)html">(.*?)</a>/',$a,$c,preg_set_order);

/*

int preg_match_all ( string $pattern , string $subject , array &$matches [, int $flags [, int $offset ]] );搜索所有匹配正则表达式的模式并提出给予他们在比赛中受的标志指定的顺序。第一场比赛后发现,随后的搜查是继续从最后一场比赛结束。


更多详细内容请查看:http://www.111cn.net/phper/php-cy/33670.htm

在这里中我们介绍了php教程命名空间的用途和namespace关键字,在这篇文章中我们将介绍一下use命令的使用以及php如何解析命名空间的名字的。

namespace bakbaba;
function bab(){
    echo "bi";
}
namespace kkk;
function k1(){
    echo "k1";
}


bakbababab();//在kkk的命名空间下使用别的命名空间,注意前面的
use bakbaba as b;//依旧在kkk的命名空间下,但是用别名的的时候以下方法也正确
#use bakbaba as b;//前面可以不使用号
bbab();//使用别名下命名空间的时候前面不该有号
k1();//调用该函数没有报错,说明use不影响当前当前命名空间

 

< ?php  
// application library 1  
namespace applib1;  
const myconst = 'applib1myconst';  
function myfunction() {  
 return __function__;  
}  
class myclass {  
 static function whoami() {  
eturn __method__;  
 }  
}  
?>
 


lib2.php
< ?php  
// application library 2  
namespace applib2;  
 
const myconst = 'applib2myconst';  
 
function myfunction() {  
 return __function__;  
}  
 
class myclass {  
 static function whoami() {  
eturn __method__;  
 }  
}  
?> 

幸好在手册中发现这么一段代码,故手册中其他关于namespace的内容,就可以忽略了,直接看下面的代码

 

<?php
namespace a;
use bd, ce as f;

// 函数调用

foo();      // 首先尝试调用定义在命名空间"a"中的函数foo()
            // 再尝试调用全局函数 "foo"

foo();     // 调用全局空间函数 "foo"

myfoo();   // 调用定义在命名空间"amy"中函数 "foo"

f();        // 首先尝试调用定义在命名空间"a"中的函数 "f"
            // 再尝试调用全局函数 "f"

// 类引用

new b();    // 创建命名空间 "a" 中定义的类 "b" 的一个对象
            // 如果未找到,则尝试自动装载类 "ab"

new d();    // 使用导入规则,创建命名空间 "b" 中定义的类 "d" 的一个对象
            // 如果未找到,则尝试自动装载类 "bd"

new f();    // 使用导入规则,创建命名空间 "c" 中定义的类 "e" 的一个对象
            // 如果未找到,则尝试自动装载类 "ce"

new b();   // 创建定义在全局空间中的类 "b" 的一个对象
            // 如果未发现,则尝试自动装载类 "b"

new d();   // 创建定义在全局空间中的类 "d" 的一个对象
            // 如果未发现,则尝试自动装载类 "d"

new f();   // 创建定义在全局空间中的类 "f" 的一个对象
            // 如果未发现,则尝试自动装载类 "f"

// 调用另一个命名空间中的静态方法或命名空间函数

bfoo();    // 调用命名空间 "ab" 中函数 "foo"

b::foo();   // 调用命名空间 "a" 中定义的类 "b" 的 "foo" 方法
            // 如果未找到类 "ab" ,则尝试自动装载类 "ab"

d::foo();   // 使用导入规则,调用命名空间 "b" 中定义的类 "d" 的 "foo" 方法
            // 如果类 "bd" 未找到,则尝试自动装载类 "bd"

bfoo();   // 调用命名空间 "b" 中的函数 "foo"

b::foo();  // 调用全局空间中的类 "b" 的 "foo" 方法
            // 如果类 "b" 未找到,则尝试自动装载类 "b"

// 当前命名空间中的静态方法或函数

ab::foo();   // 调用命名空间 "aa" 中定义的类 "b" 的 "foo" 方法
              // 如果类 "aab" 未找到,则尝试自动装载类 "aab"

ab::foo();  // 调用命名空间 "ab" 中定义的类 "b" 的 "foo" 方法
              // 如果类 "ab" 未找到,则尝试自动装载类 "ab"
?>

<?
function turntopage($url="index.php",$info = "页面转向中...",$second=2){
print "<html>n<head>n<title>页面转向中....</title>n";
print "<meta http-equiv="refresh" content="$second;url=$url">n"; //开源代码111cn.net
print "<style type="text/css教程">n<!--n";
print "td { font-family: "verdana", "arial";font-size: 12px}n";
print "a {color: #000000; text-decoration: none}n";
print "-->n</style>n";
print "</head>n<body>n";
print "<table width="100%" border="0" align="center">n";

//111cn.net

print " <tr>n";
print " <td height="200"> </td>n";
print " </tr>n";
print " <tr>n";
print " <td align="center">n";
print " <table width="60%" border="0" cellpadding="8" bgcolor="#aa9fff">n";

//开源代码111cn.net

print " <tr>n";
print " <td height="30" align="center">页面转向提示信息</td>n";
print " </tr>n";
print " <tr>n";
print " <td align="center">$info</td>n";
print " </tr>n";
print " <tr>n";

//111cn.net

print " <td align="center">n";
print " <a href="$url">如果你的浏览器不支持自动跳转,请按这里</a></td>n";
print " </tr>n";
print " </tr>n";
print " </table></td>n";
print " </tr>n";
print " <tr>n"; //开源111cn.net
print " <td height="200"> </td>n";
print " </tr>n";
print "</table>n";
print "</body>n</html>";
exit;
?>

php重定向
<?
方法一:header("location: index.php");
方法二:echo "<scrīpt>window.location ="$php_self";</scrīpt>";

//开源代码111cn.net

方法三:echo "<meta http-equiv="refresh" content="0; url=index.php">";
?>

 

[!--infotagslink--]

相关文章

  • 使用PHP+JavaScript将HTML页面转换为图片的实例分享

    这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19
  • 在数据库里将毫秒转换成date格式的方法

    在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。 一、 在MySQL中,有内置的函数from_unixtime()来做相应的转换,使用如下: 复制...2014-05-31
  • Javascript类型转换的规则实例解析

    这篇文章主要介绍了Javascript类型转换的规则实例解析,涉及到javascript类型转换相关知识,对本文感兴趣的朋友一起学习吧...2016-02-27
  • 美图秀秀把普通照片快速转换成卡通效果教程

    今天小编在这里就来给美图秀秀的这一款软件的使用者们来说下把普通照片快速转换成卡通效果的教程,各位想知道具体制作步骤的使用者们,那么下面就快阿里跟着小编一起看一...2016-09-14
  • 浅析C#数据类型转换的几种形式

    本篇文章是对C#中数据类型转换的几种形式进行了详细的分析介绍,需要的朋友参考下...2020-06-25
  • JavaScript实现数据类型的相互转换

    这篇文章主要为大家详细介绍了JavaScript实现数据类型的相互转换,感兴趣的朋友可以参考一下...2016-03-09
  • JavaScript实现Base64编码转换

    这篇文章主要介绍了JavaScript实现Base64编码转换的相关资料,非常简单实用,需要的朋友可以参考下...2016-04-25
  • PHP编码转换函数mb_convert_encoding与iconv用法

    文章来实现一个PHP编码转换函数mb_convert_encoding与iconv用法,希望例子能帮助到各位。 将一个短信接口代码从apache迁移到nginx+php-fpm后,发现无法发出短信了,查...2016-11-25
  • c#入门之类型转换详解

    这篇文章主要介绍了c#的类型转换详解,类型转换分两种形式:隐式转换、显示转换,下面是详细介绍...2020-06-25
  • C#将数字转换成字节数组的方法

    这篇文章主要介绍了C#将数字转换成字节数组的方法,涉及C#字符串操作的技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • java中JSONObject转换为HashMap(方法+main方法调用实例)

    这篇文章主要介绍了java中JSONObject转换为HashMap(方法+main方法调用实例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-14
  • JSON字符串转换JSONObject和JSONArray的方法

    这篇文章主要介绍了JSON字符串转换JSONObject和JSONArray的方法的相关资料,需要的朋友可以参考下...2016-06-12
  • php中iconv编码转换来解决中文乱码的问题

    用到iconv函数把抓取来过的utf-8编码的页面转成gb2312, 发现只有用iconv函数把抓取过来的数据一转码数据就会无缘无故的少一些 代码如下 复制代码 ...2016-11-25
  • c#之用户定义的数据类型转换介绍

    c#允许定义自己的数据类型,这意味着需要某些工具支持在自己的数据类型间进行数据转换。方法是把数据类型转换定义为相关类的一个成员运算符,数据类型转换必须声明是隐式或者显式,以说明怎么使用它...2020-06-25
  • photoshop把照片转换为铅笔素描画人像效果后期处理教程

    今天小编在这里就来给各位photoshop的这一款软件的使用者们来说一说把照片转换为铅笔素描画人像效果的后期处理教程,各位想知道具体的后期处理方法的使用者们,那么大家...2016-09-14
  • Golang中的自定义类型之间的转换的实现(type conversion)

    这篇文章主要介绍了Golang中的自定义类型之间的转换的实现(type conversion),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-21
  • C#数据类型及其转换详解

    这篇文章主要介绍了C#数据类型及其转换详解,在C#中,数据类型可以分为几种类型,今天小编通过本文给大家详细介绍,需要的朋友可以参考下...2020-07-10
  • Lua判断变量是否为数字、字符串是否可以转换为数字等

    这篇文章主要介绍了Lua判断变量是否为数字、字符串是否可以转换为数字等,本文讲解了Lua 判断是字符还是数字的方法、Lua判断数字的方法、判断可否转换为数字的方法、判断并且准备一个初值的方法,需要的朋友可以参考下...2020-06-30
  • .Net(c#)汉字和Unicode编码互相转换实例

    下面小编就为大家带来一篇.Net(c#)汉字和Unicode编码互相转换实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • Python将字典转换为XML的方法

    这篇文章主要介绍了Python将字典转换为XML的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-08-02