最近想用php编程判断字符串是否由汉语拼音构成,如"niwota"是的,而"qwe"不是。程序如下:<?php
$strlist = array('niwota','renmen','cange','aou','wanin','jiong','sdfeioioerio','dijsjkds'); #要判断的字符串
$pinyin_list =array(1 => array()); #将拼音字符串按长度分组
$listfile = file("pinyinlist.txt"); #读取文件
$maxlen = 1;
foreach($listfile as $pinyin){ #将拼音字符串按长度装入数组 $pinyin_list 中
$pinyin = trim($pinyin);
$len = strlen($pinyin);
if($len>$maxlen) $maxlen = $len;
$pinyin_list[$len][]=$pinyin;
}
function is_pinyin($pinyin){ #判断某个字符串是否为拼音,按不同的长度判断
global $pinyin_list;
$len = strlen($pinyin);
if($len>6) return false;
foreach($pinyin_list[$len] as $pinyin_cmp){
if(strcasecmp($pinyin,$pinyin_cmp) == 0) return true;
}
return false;
}
function is_pinyinstring($pinyin_string){ #判断某个字符串是否由拼音构成
$len = strlen($pinyin_string);
if($len <= 6){ #因为最长的拼音为 6 位,所以先截取前6位来判断,若字符串小于 6 位,则直接判断整个字符串
$len_this = $len;
}else{
$len_this = 6;
}
for($i=$len_this;$i>0;$i--){ /*依次递减,如果该长度的字符串不是拼音,减一位再判断,减到一位若还不是拼音,则该字符串不是由拼音构成。*/
$pinyin = substr($pinyin_string,0,$i); #截取前几位
if(is_pinyin($pinyin)){
echo $pinyin . " ". $i . " " . $len . " ";
if($i == $len_this  && $len <= 6 ){ /*如果字符串小于6位,而且字符串本身即为拼音,则直接返回true*/
echo "t";
return true;
}
is_pinyinstring(substr($pinyin_string,$i));/*如果上一步没有包含整个字符串,则递归判断剩下的字符串是否由拼音构成*/
break;
}
}
return false;
}foreach($strlist as $str){
echo $str . ": ";
if(is_pinyinstring($str)){
echo "true";
}else{
echo "false";
}
echo "</br>";
}
?>文件pinyinlist.txt的内容:
a
ai
an
ang
ao
ba
bai
ban
bang
bao
bei
ben
beng
bi
bian
biao
bie
bin
bing
bo
bu
ca
cai
can
cang
cao
ce
cei
cen
ceng
cha
chai
chan
chang
chao
che
chen
cheng
chi
chong
chou
chu
chua
chuai
chuan
chuang
chui
chun
chuo
ci
cong
cou
cu
cuan
cui
cun
cuo
da
dai
dan
dang
dao
de
den
dei
deng
di
dia
dian
diao
die
ding
diu
dong
dou
du
duan
dui
dun
duo
e
ei
en
eng
er
fa
fan
fang
fei
fen
feng
fo
fou
fu
ga
gai
gan
gang
gao
ge
gei
gen
geng
gong
gou
gu
gua
guai
guan
guang
gui
gun
guo
ha
hai
han
hang
hao
he
hei
hen
heng
hong
hou
hu
hua
huai
huan
huang
hui
hun
huo
ji
jia
jian
jiang
jiao
jie
jin
jing
jiong
jiu
ju
juan
jue
jun
ka
kai
kan
kang
kao
ke
ken
keng
kong
kou
ku
kua
kuai
kuan
kuang
kui
kun
kuo
la
lai
lan
lang
lao
le
lei
leng
li
lia
lian
liang
liao
lie
lin
ling
liu
long
lou
lu
lv
luan
lve
lun
luo
ma
mai
man
mang
mao
me
mei
men
meng
mi
mian
miao
mie
min
ming
miu
mo
mou
mu
na
nai
nan
nang
nao
ne
nei
nen
neng
ni
nian
niang
niao
nie
nin
ning
niu
nong
nou
nu
nv
nuan
nve
nuo
nun
o
ou
pa
pai
pan
pang
pao
pei
pen
peng
pi
pian
piao
pie
pin
ping
po
pou
pu
qi
qia
qian
qiang
qiao
qie
qin
qing
qiong
qiu
qu
quan
que
qun
ran
rang
rao
re
ren
reng
ri
rong
rou
ru
ruan
rui
run
ruo
sa
sai
san
sang
sao
se
sen
seng
sha
shai
shan
shang
shao
she
shei
shen
sheng
shi
shou
shu
shua
shuai
shuan
shuang
shui
shun
shuo
si
song
sou
su
suan
sui
sun
suo
ta
tai
tan
tang
tao
te
teng
ti
tian
tiao
tie
ting
tong
tou
tu
tuan
tui
tun
tuo
wa
wai
wan
wang
wei
wen
weng
wo
wu
xi
xia
xian
xiang
xiao
xie
xin
xing
xiong
xiu
xu
xuan
xue
xun
ya
yan
yang
yao
ye
yi
yin
ying
yo
yong
you
yu
yuan
yue
yun
za
zai
zan
zang
zao
ze
zei
zen
zeng
zha
zhai
zhan
zhang
zhao
zhe
zhei
zhen
zheng
zhi
zhong
zhou
zhu
zhua
zhuai
zhuan
zhuang
zhui
zhun
zhuo
zi
zong
zou
zu
zuan
zui
zun
zuo但是有几个明明是应该返回ture的,而且在echo "t"处也确实输出了t ,但是输出的却是 false 。好像是return ture语句之后后面的语句还是运行了。

解决方案 »

  1.   

    你是希望有人读懂你的程序再回答你么?我花了20分钟没跟上你的思路,pass如果有拼音字表,其实有更好的方法
    另外,这个程序的用处?
    譬如:英文 You 和汉语 You(有) 怎么分?
    nakayama(那卡亚麻) 算汉语拼音么?这个其实是日本人姓氏“中山”的英文写法
      

  2.   

    谢谢楼上的答复,我是新手,程序写的很差,我主要就是想问,在function is_pinyinstring函数中,明明运行了return true,但是结果却返回的是false。另外英文"you"算成拼音,"nakayama"也是拼音,只要看它们是不是拼音,不管他们的意义,像"xian"这种,分成"xi'an"或"xian"也无所谓,还有请教你的更好的方法。
      

  3.   


    关于第二个问题,主要是看你对拼音的规则了解了谋定而后动。先想想拼音的规则再用Php实现就Ok了。
      

  4.   

    function is_pinyin($pinyin){ #判断某个字符串是否为拼音,按不同的长度判断
        global $pinyin_list;
        $len = strlen($pinyin);
        if($len>6) return false;
        foreach($pinyin_list[$len] as $pinyin_cmp){
            if(strcasecmp($pinyin,$pinyin_cmp) == 0) return true;
        }
        return false;
    }global $pinyin_list; 这里定义的全局变量貌似是空值,感觉位置不对。
      

  5.   

    这是很常见的书写递归程序的毛病了:忘记了传递递归函数的返回值!            is_pinyinstring(substr($pinyin_string,$i));/*如果上一步没有包含整个字符串,则递归判断剩下的字符串是否由拼音构成*/应写作
       return is_pinyinstring(substr($pinyin_string,$i));/*如果上一步没有包含整个字符串,则递归判断剩下的字符串是否由拼音构成*/
      

  6.   

    @xuzuning 非常感谢,问题就在这,我学php还是第一次用递归,其他语言的递归似乎不用 return的。
    @yiqiang1314 好像 php中在函数中要调用函数外的量时就用 global 申明下吧,跟其他语言还是不一样的……
    @falizixun2 写着自己用的,呵呵。
      

  7.   

    问题解决了,谢谢各位的热情回复。特别感谢xuzuning大侠,以后知道怎么用php的递归了