【问题标题】:strtolower($a)==strtolower($b)!=match?strtolower($a)==strtolower($b)!=匹配?
【发布时间】:2011-06-23 00:47:22
【问题描述】:

好的,我有一个比较值并返回结果的函数,无论大小写,即:Interfacility Transfer = INTERFACILITY TRANSFER 这里是函数:

function fncResult ($expVal, $actVal)
{
    $negNulls=array("-5","-10","-15","-20","-25");
    if (!in_array($expVal, $negNulls))
    {
        if(strtolower($expVal)==strtolower($actVal))
        {
            echo "
            <td class='match' title='The values match.'>Match</td>
        </tr>";
        }
        else
        {
            echo "
                            <td class='notMatch'  title='The values do not match.'>Not Match<br />No Match</td>
                        </tr>";
        }
    }
    else
    {
        echo "
            <td class='null'  title='The value in the XML was a negative null.'>Negative Null</td>
        </tr>";
    }
}

它在大约 99% 的时间都有效,除非涉及到这个:

//--Type of service requested
        echo "
            <tr>
                <td>E02_04</td>
                <td>Type of Service Requested</td>
                <td>36. &lt;Nature of Call&gt;</td>
                <td>$fldServReq</td>
                <td>".fncGrabNemsis("E02_04",$fldServReq,$local)."</td>
                <td>".fncIsSet($CZ_E02_04[1])."</td>";
        fncResult(fncGrabNemsis("E02_04",$fldServReq,$local),fncIsSet($CZ_E02_04[1]));

虽然看起来比较复杂,其实也只是strtolower($expVal)==strtolower($actVal),比较。当我回显正在比较的值时,我得到:“设施间转移”和“设施间转移”和“不匹配”...... WTF?可能是因为第一个值来自 XML(UTF-8),而第二个值来自 DB(?)我不知道该怎么做,因为这是一项简单的任务,我感到非常沮丧。感谢您的帮助!

【问题讨论】:

  • 你为什么不直接使用strcasecmp
  • 可能有空格。 var_dump 并检查它们的长度是否相等,或者先在输入上尝试trim
  • 如果没有看到提供给它的数据,所有这些代码都是无用的。您很可能在字符编码方面遇到问题。
  • 该用户可能遇到过类似问题:stackoverflow.com/questions/3636559/…。同样,这个:stackoverflow.com/questions/1089966/…。换句话说,同一个 Unicode 字符可以用不同的字节序列来表示。您可以发布字符串的 hex 转储吗?

标签: php mysql string compare match


【解决方案1】:

打印出 expval 和 actval 的字节(例如 urlencode)。有许多看起来完全相同的不同字符(例如,普通空格和不间断空格,或cesroman 100)。

【讨论】:

    【解决方案2】:

    您的字符串中是否有任何尾随空格?也许嵌套trim()strtolower() 会解决这个问题?如果您在 HTML 输出中查看此内容,请查看源代码并确保其中没有 HTML 实体将其弄乱(即“interfacility transfer”和“interfacility transfer”不一样,但可能看起来在 HTML 中呈现的相同)。

    最后的选择是“升级”到mb_strtolower,看看是不是编码问题。

    【讨论】:

      猜你喜欢
      • 2011-05-25
      • 2011-08-09
      • 1970-01-01
      • 2016-01-22
      • 2011-01-25
      • 1970-01-01
      • 2017-11-30
      • 2013-03-21
      • 2010-10-26
      相关资源
      最近更新 更多