PHP 比较字符串

本文最后更新于:2024年3月18日 凌晨

PHP 比较字符串

  • PHP有两个操作符和6个函数用于字符串间相互比较。

精确比较

  • 你可以用=====操作符来比较两个字符串是否相等,这两个操作符的不同在于它们如何处理非字符串数据类型的操作数,==操作符把非字符串操作数准换成字符串,所以它认为3和"3"使相等的,===操作符不进行转换,并且如果参数的数据类型不同就返回false
1
2
3
4
5
6
7
8
9
10
$o1 = 3;
$02 = "3";
if($o1 == $o2){
echo("== returns true<br>");
}
if($o1 === $o2){
echo("=== returns true<br>");
}

==returns true
  • 比较运算符(<,<=,>>=)也用于字符串:
1
2
3
4
5
6
7
$him = "Fred";
$her = "Wilma";
if($him < $her){
print "$him comes before $her in the alphabet.\n"
}

Fred comes before Wilma in the alphabet
  • 然而,在比较字符串和数字时,比较操作符会给出意想不到的结果:
1
2
3
4
5
6
7
$string = "PHP Rocks";
$number = 5;
if($string < $number){
echo ("$string<$number");
}

PHP Rocks < 5
  • 当比较操作符的一个参数是数据时,其他也将被转换为数字类型,这就意味着"PHP Rocks"被准换成数字0(因为这个字符串没有以数字开头),因为0<5,所以PHP打印出"PHP Rocks < 5"
  • 要明明确地将两个字符串作为字符串来比较,可以在必要时先把数字准换为字符串,使用strcmp()函数:
1
$relationship = strcmp(string_1,string_2);
  • 如果string_1的字典排序在string_2之前(即string_1 < string_2),函数返回小于0的数字,如果string_1次序在string_2之后,函数返回大于0的数字,如果它们相等则返回0:
1
2
3
4
$n = strcmp("PHP Rocks", 5);
echo($n);

1
  • strcasecmp()strcmp()的一个变种,strcasecmp()在比较字符串之前先把字符串转换为小写,它的参数和返回值都和strcmp()相同:
1
$n = strcasecmp("Ferd","frED");		//$n是0
  • 字符串比较的另一个变种是只比较字符串的前几个字符,strncmp()strncasecmp()函数有一个附加的参数,这个参数来指定用于比较的初始字符个数:
1
2
$relationship = strnmp(string_1,string_2,len);
$relationship = strncasecmp(string_1,string_2,len);
  • 这些函数的最后一个变种是用strnatcmp()strnatcasecmp()进行自然顺序(natural-order)的比较,这两个函数和strcmp()有相同的参数,并且返回同种类型的值,自然顺序的比较可以识别出待比较的字符串中数字的部分,并且把字符串部分和数字部分分开来排序。
  • 下表显示了字符串的自然顺序和ASCII顺序:
自然顺序 ASCII顺序
pic1.jpg Pic1.jpg
pic5.jpg Pic10.jpg
pic10.jpg Pic5.jpg
pic50.jpg Pic50.jpg

近似相等

  • PHP提供了一些函数来测试两个字符串是否近似相等:soundex(),metaphone(),similar_text()levenshtein()
1
2
3
4
5
$soundex_code() = soundex($string);
$metaphone_code = metaphone($string);
$in_common = similar_text($string_1,$string_2[,$percentage]);
$similarity = lebenshtein($string_1,$string_2);
$similarity = levenshtein($string_1,$string_2[,$cost_ins,$cost_rep,$cost_del]);
  • Soundex和Metaphone算法都生成一个字符串来大致表示单词在英语中如何发音,可以用这些算法来比较两个字符串的发音,从而判断它们是否近似相等,可以只将Soundex的值和Soundex的值比较,Metaphone的值和Metaphone的值比较,一般来说Metaphone算法更加准确,下面的例子将证实这一点:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$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()函数返回两个字符串参数共有的字符个数,如果设置了第三个参数,则第三个参数作为存放共有字符百分比的变量:
1
2
3
4
5
6
$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”):
1
$similarity = levenshtein("cat","cot");	//$similarity为1
  • 一般来说这样计算相似度比使用similar_text()函数更快,可以随意地传递三个值给levenshtein()函数来分别决定插入,删除,替换三种操作的权重(权重越大,对相似度的影响越大),例如,比较一个单词和它的缩写。
  • 这个例子在比较一个字符串和它可能的缩进时过分地增加了插入的权重,因为缩写时不可能插入字符:
1
2
3
echo levenshtein('would not','wouldn\t',500,1,1);

2 // 需要删除一个字符(空格),替换一个字符(o->'),所以输出2

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!