转载请保留本行链接:http://www.www.luoye.org/html/ 转载许可:署名-非商业性使用-相同方式共享
PHP有两个操作符和六个函数可以用来比较两个字符串。
1、精确比较
可以用==或者===这两个操作符来对两个字符串进行比较。==和===的区别在于它们对于操作数是非字符串时的处理方法。==会把非字符串的操作 数转换为字符串,这样如果操作数是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。所以结果是“HP Rocks < 5”。
在实际使用中,更多的是想比较两个字符串的大小。这时,可以用strcmp()函数,它可以把数字类型转换成字符串。例如:
$relationship = strcmp(string_1, string_2);
如果string_1小于string_2,返回负数;如果string_1小于string_2,返回一个大于0的数;如果string_1等于string_2,返回0。这样用strcmp()改写以上的例子,如:
$n = strcmp(”PHP Rocks”, 5);
echo($n);
以上例子输出:1
strcmp()函数还有一个版本:strcasecmp()。strcasecmp()函数会在比较前,先将字符串都变成小写的形式,然后再进行比较。字符串的比较方式和strcmp()函数是一样的。例如:
$n = strcasecmp(”Fred”, “frED”); // $n is 0
另一个版本可以再指定一个参数,这个参数是两个字符串要进行比较的长度。比如:
$relationship = strncmp(string_1, string_2, len);
$relationship = strncasecmp(string_1, string_2, len);
这些函数的最后一个版本比较的是两个字符串的自然顺序:strnatcmp()和strnatcasecmp(),其参数和返回值和strcmp()函数是一样的。下表列出了自然顺序和ASCII顺序的比较结果:
Natural order versus ASCII order |
|
|
Natural order |
ASCII order |
|---|---|
| pic1.jpg | pic1.jpg |
| pic5.jpg | pic10.jpg |
| pig10.jpg | pic5.jpg |
| pic50.jpg | pic50.jpg |
2、近似比较
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()函数,要么用metaphone()函数,而不能将soundex()函数 产生的结果和metaphone()函数产生的结果相比较。metaphone()函数的算法看起来更准确点,下面来看看它们的例子:
$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%).
levenshtein算法是这样的:如果两个字符串要完全一致,需要增加、减少或者修改几个字符,函数就返回这个字符。这个字符就是相似度,值越小表示这两个字符串越相似。比如,cat和cot的相似度就是1,因为我们只要修改一个字符就可以使它们相等。
$similarity = levenshtein(”cat”, “cot”); // $similarity is 1
levenshtein算法要比similar_text来的要快。