• 2009-02-24
  • PHP - 字符串比较
  • 转载请保留本行链接: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来的要快。

  • x
Powered by LuoYe Lab , Skin in Kaven,XiaoXu RSS Copyright © 2008