我正在尝试使用文本框写一个搜索引擎,例如“Mi”,然后选择并显示“ Mi ke Ross”。然而,它不适用于空间。我写"Mike"
然后我得到“ Mike Ross”,但当我写“Mike”时,我得到了“Mike Ross”(没有大胆)。
口音也是如此。 所以我写“Jo”,结果是“ Jo ãoCarlos”。如果我写“Joa”,结果是“JoãoCarlos”(没有任何大胆的部分)。我想在写作时忽略重音,但仍然会在结果中显示它们。
所以这是我在SELECT之后的脚本:
while($row = $result->fetch_array()) {
$name = $row['name'];
$array = explode(' ',trim($name));
$array_length = count($array);
for ($i=0; $i<$array_length; $i++ ) {
$letters = substr($array[$i], 0, $q_length);
if (strtoupper($letters) == strtoupper($q)) {
$bold_name = '<strong>'.$letters.'</strong>';
$final_name = preg_replace('~'.$letters.'~i', $bold_name, $array[$i], 1);
$array[$i] = $final_name;
}
array[$i] = array[$i]." ";
}
foreach ($array as $t_name) { echo $t_name;
}
感谢您的帮助!
答案 0 :(得分:0)
if (strtoupper($letters) == strtoupper($q))
由于您要使用explode(' ', trim($name)
从可匹配字母集中删除空格,因此永远不会将空格评估为“true”,从而有效地使$q
的任何值具有与{{1}无法匹配的空格}
这是一个快速示例,可以完成我认为您正在寻找的内容
$letters
从我所知道的(一个快速的谷歌“替换重音字符PHP”),你有点运气不好。 This question使用<?php
$q = "Mike "; // User query
$name = "Mike Ross"; // Database row value
if(stripos($name, $q) !== false) // Case-insensitive match
{
// Case-insensitive replace of match with match enclosed in strong tag
$result = preg_replace("/($q)/i", '<strong>$1</strong>', $name);
print_r($result);
}
// Result is
// <strong>Mike </strong>Ross
提供快速解决方案,而this tip使用与strtr
类似的方法。
不幸的是,这些依赖于预定义的字符集,因此您尚未准备好的传入重音会失败。您可能最好依靠用户在搜索时输入特殊字符,或者创建一个具有“可搜索”名称的新列,并尽可能地替换重音字符,并将实际名称作为“匹配”显示返回字段。
再注意
我found another solution可以完成你想要的大部分工作,除了返回的名字没有重音。但是,它将使用非重音搜索匹配DB中的重音值。修改后的代码是:
str_replace