4.6 比较字符串
Comparing Strings
PHP有两个操作符和6个函数用于字符串间相互比较。
4.6.1 精确比较
Exact Comparisons
你可以用= =和= = =操作符来比较两个字符串是否相等。这两个操作符的不同在于它们如何处理非字符串数据类型的操作数。==操作符把非字符串操作数转换成字符串,所以它认为3 和 "3"是相等的。===操作符不进行转换,并且如果参数的数据类型不同就返回false。
$o1 = 3;
$o2 = "3";
if ($o1 == $o2) {
echo("== returns true<br>");
}
if ($o1 === $o2) {
echo("=== returns true<br>");
}
== returns true
比较操作符(<、<=、>和>=)也用于字符串:
$him = "Fred";
$her = "Wilma";
if ($him < $her) {
print "$him comes before $her in the alphabet.\n";
}
Fred comes before Wilma in the alphabet
然而,在比较字符串和数字时,比较操作符会给出意想不到的结果:
$string = "PHP Rocks";
$number = 5;
if ($string < $number) {
echo("$string < $number");
}
PHP Rocks < 5
当比较操作符的一个参数是数字时,其他参数也将被转换为数字类型。这就意味着"PHP Rocks"被转换成数字0(因为这个字符串没有以数字开头)。因为0小于5,所以PHP打印出"PHP Rocks < 5"。
要明确地将两个字符串作为字符串来比较,可以在必要时先把数字转换为字符串,使用strcmp( )函数:
$relationship = strcmp(string_1, string_2);
如果string_1 的字典排序在 string_2 之前(即string_1 < string_2),函数返回小于0的数字;如果string_1 次序在 string_2之后,函数返回大于0的数字;如果它们相等,则返回0:
$n = strcmp("PHP Rocks", 5);
echo($n);
1
strcasecmp( ) 是strcmp( ) 的一个变种,strcasecmp( )在比较字符串之前先把字符串转换为小写。它的参数和返回值都和strcmp()相同:
$n = strcasecmp("Fred", "frED"); // $n 是 0
字符串比较的另一个变种是只比较字符串的前几个字符。strncmp( )和strncasecmp( )函数有一个附加的参数,这个参数用来指定用于比较的初始字符个数:
$relationship = strncmp(string_1, string_2, len);
$relationship = strncasecmp(string_1, string_2, len);
这些函数的最后一个变种是用strnatcmp( )和strnatcasecmp( )进行自然顺序(natural- order)的比较,这两个函数和strcmp()有相同的参数,并且返回同种类型的值。自然顺序的比较可以识别出待比较的字符串中数字的部分,并且把字符串部分和数字部分分开来排序。
表4-5显示了字符串的自然顺序和ASCII顺序。
表4-5:自然顺序和ASCII顺序
|
自然顺序 |
ASCII顺序 |
|
pic1.jpg |
Pic1.jpg |
|
pic5.jpg |
Pic10.jpg |
|
pic10.jpg |
Pic5.jpg |
|
pic50.jpg |
Pic50.jpg |
4.6.2 近似相等
Approximate Equality
PHP提供了一些函数来测试两个字符串是否近似相等:soundex( )、metaphone( )、similar_text( )和levenshtein( )。
$soundex_code = soundex($string);
$metaphone_code = metaphone($string);
$in_common = similar_text($string_1, $string_2 [, $percentage ]);
$similarity = levenshtein($string_1, $string_2);
$similarity = levenshtein($string_1, $string_2 [, $cost_ins, $cost_rep, $cost_del ]);
Soundex和Metaphone算法都生成一个字符串来大致表示单词在英语中如何发音。可以用这些算法来比较两个字符串的发音,从而判断它们是否近似相等。可以只将Soundex 的值和 Soundex 的值比较, Metaphone 的值和 Metaphone 的值比较。一般来说Metap- hone算法更加准确,下面的例子将证实这一点:
$known = "Fred";
$query = "Phred";
if (soundex($known) == soundex($query)) {
print "soundex: $known sounds $query<br>";
} else {
print "soundex: $known doesn't sound like $query<br>";
}
if (metaphone($known) == metaphone($query)) {
print "metaphone: $known sounds $query<br>";
} else {
print "metaphone: $known doesn't sound like $query<br>";
}
soundex: Fred doesn't sound like Phred
metaphone: Fred sounds like Phred
similar_text( )函数返回两个字符串参数共有的字符个数。如果设置了第三个参数,则第三个参数作为存放共有字符百分比的变量:
$string_1 = "Rasmus Lerdorf";
$string_2 = "Razmus Lehrdorf";
$common = similar_text($string_1, $string_2, $percent);
printf("They have %d chars in common (%.2f%%).", $common, $percent);
They have 13 chars in common (89.66%).
加、替换或删除多少字符来计算。例如,"cat"和"cot"的Levenshtein距离为1,因为你要使它们相等只需改变一个字符("a"变成"o"):
$similarity = levenshtein("cat", "cot"); // $similarity 为 1
一般来说这样计算相似度比使用similar_text( )函数更快。可以随意地传递三个值给levenshtein( )函数来分别决定插入、删除、替换三种操作的权重(权重越大,对相似度的影响越大)——例如,比较一个单词和它的缩写。
这个例子在比较一个字符串和它可能的缩写时过分地增加了插入的权重,因为缩写时不可能插入字符:
echo levenshtein('would not', 'wouldn\'t', 500, 1, 1);
2
//需要删除一个字符(空格),替换一个字符(o->’),所以输出2 。







