PHP strpos()返回错误的结果

时间:2014-01-28 12:32:08

标签: php string

我正在尝试在PHP函数中格式化名称。名称格式为Forname SURNAME,我需要格式Forename Surname

我写的函数做得很好但是当遇到诸如O'HARE之类的姓氏时,当所需格式为O'hare时,返回的名称为O'Hare

要实现此条件,我使用以下代码:

...
if(stripos($name, "O'") != false)
{
    $nameArr = array();
    $expl3 = explode(' ', trim($name));
    print_r($expl3); //this prints [0] => Forename [1] => O'SURNAME as expected
    foreach($expl3 as $ex)
    {
        if(stripos($ex, "O'") != false)
        {
            echo '<h1>string position found</h1>'; //this condition is not being met
            $newName    = str_replace("O'", '', ($ex));
            $nameArr[]  = "O'" . ucfirst(strtolower($newName));
        }
        else
        {
            $nameArr[] = ucfirst(strtolower($ex));
        }
    }
    $formattedName = implode(' ', $nameArr);
}
else
{
    $formattedName = trim(ucwords(strtolower($name)));
}
return $formattedName;

该函数仍以Forename O'SURNAME格式返回名称。

我的问题是为什么第二个stripos()找不到O'时,显然它确实存在于我print_r()时?{/ p>

3 个答案:

答案 0 :(得分:3)

您需要与!==进行严格比较:

stripos($ex, "O'") !== false

stripos()将返回0的索引,因为O'位于字符串的开头。如果根本找不到子字符串,则返回false,这就是你需要进行严格(类型检查)比较的原因。

可以找到更多in the documentation

答案 1 :(得分:0)

!=更改为!==,您的代码将完美运行。

因此stripos($name, "O'") != false应成为stripos($name, "O'") !== falsestripos($ex, "O'") != false应成为stripos($ex, "O'") !== false

从PHP手册:

  

此函数可能返回布尔值FALSE,但也可能返回非布尔值,其值为FALSE。有关详细信息,请阅读Booleans部分。使用=== operator测试此函数的返回值。

stripos($x, $y)0开头$y时返回$xfalse {}返回$y $x == != 1}}。宽松的比较(===!==)无法区分这两种截然不同的情况。因此,您需要严格比较(var_dump(0 != false); var_dump(0 !== false); 或{{1}}),这不仅会检查左侧和右侧的值,还会检查左侧和右侧的类型。

运行以下代码,问题将清楚:

{{1}}

答案 2 :(得分:0)

试试这个:

if(stripos($ex, "O'") !== false)

问候!