我正在尝试在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>
答案 0 :(得分:3)
您需要与!==
进行严格比较:
stripos($ex, "O'") !== false
stripos()
将返回0
的索引,因为O'
位于字符串的开头。如果根本找不到子字符串,则返回false
,这就是你需要进行严格(类型检查)比较的原因。
可以找到更多in the documentation
答案 1 :(得分:0)
将!=
更改为!==
,您的代码将完美运行。
因此stripos($name, "O'") != false
应成为stripos($name, "O'") !== false
而stripos($ex, "O'") != false
应成为stripos($ex, "O'") !== false
。
从PHP手册:
此函数可能返回布尔值FALSE,但也可能返回非布尔值,其值为FALSE。有关详细信息,请阅读Booleans部分。使用=== operator测试此函数的返回值。
stripos($x, $y)
在0
开头$y
时返回$x
,false
{}返回$y
$x
==
!=
1}}。宽松的比较(===
或!==
)无法区分这两种截然不同的情况。因此,您需要严格比较(var_dump(0 != false);
var_dump(0 !== false);
或{{1}}),这不仅会检查左侧和右侧的值,还会检查左侧和右侧的类型。
运行以下代码,问题将清楚:
{{1}}
答案 2 :(得分:0)
试试这个:
if(stripos($ex, "O'") !== false)
问候!