两个不同的字符串如何匹配?

时间:2013-04-23 07:52:30

标签: php string comparison

我根据数据库中的值测试表单的输入。对于传真和电话号码,字符串比较失败。

$fax = trim($args['fax']);
$oldFax = trim($address->getFax());
if($fax != $oldFax){
  $address->setFax($fax);
  $address->flagChanged('fax');
}

上述测试在比较“+494321”和“00494321”时找到匹配项。这是为什么?如果我测试使用!==而不是按预期工作。

5 个答案:

答案 0 :(得分:2)

由于!==比较值,因此!=会隐式将字符串转换为整数。

答案 1 :(得分:1)

让我给你一个链接:

http://php.net/manual/en/language.operators.comparison.php

  

如果您比较数字字符串,则每个字符串都会转换为数字,省略所有前导零和符号(并以数字方式执行比较)。

答案 2 :(得分:1)

这是因为type juggling,这意味着strings can be used as numbers,而你正在使用"松散地等于" comparison operator ==

如果表达式的操作数是数字(即包含数字并且可以被认为是数字),那么它将被转换为适当的数字类型(在比较之前integerfloat)。所以,这就是PHP实际看到以下表达式的方式:

("+494321" == "00494321") => (494321 == 494321)

第一个操作数删除了加号(它只是表示数字是正数),第二个操作数的零被截断(它们实际上并不意味着什么;即077都是相同的十进制数,只是略有不同)。

如果你想比较两个字符串完全,那么有几种方法可以做到。首先是简单地使用"完全等于"运营商===。使用此运算符,操作数永远不会被类型变换,也就是说比较运算符的两侧将完全匹配;字符串将是字符串,整数将是整数,等等。

例如,这两个表达式都等于false

"123" === 123
"006" === 6

另一种方法是使用strcmp函数(或类似的相关函数)。它逐字节地比较字符串:

$a = "+494321";
$b = "00494321";
if (strcmp($a, $b) === 0) {
    echo "The same";
} else {
    echo "Not the same";
}

如果两个字符串之间没有差异(即,存在零差异),则函数返回0。如果返回的数字小于或大于0,则两个字符串不相同。

答案 3 :(得分:0)

因为

=== and !== 

做严格匹配。而

== and !=

没有。

答案 4 :(得分:0)

尽可能始终进行严格的比较。

==!=做了非常奇怪的事情,例如在你的情况下,两者看起来都像数字,所以PHP将以数字方式比较字符串(=尝试将它们转换为整数并进行比较)。

手册中有更多奇怪的例子:http://php.net/manual/en/language.operators.comparison.php