【问题标题】:PHP - Search, put letters written in boldPHP - 搜索,把字母写成粗体
【发布时间】:2014-12-31 15:40:08
【问题描述】:

我正在尝试做一个搜索引擎,我在文本框中写字,例如“Mi”,它会选择并显示“Mike Ross”。但是它不适用于空格。我写"Mike" 得到“Mike Ross”,但是当我写“Mike”时得到“Mike Ross”(没有粗体)。

重音也是如此。 所以我写了“Jo”,结果是“João Carlos”。如果我写“Joa”,结果是“João Carlos”(没有任何粗体部分)。我想在写作时忽略重音,但仍会在结果中显示它们。

这是我在 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;
}

感谢您的帮助!

【问题讨论】:

    标签: php mysqli


    【解决方案1】:
    if (strtoupper($letters) == strtoupper($q))
    

    这永远不会评估为带有空格的“真”,因为您要从explode(' ', trim($name) 的可匹配字母集中删除空格,从而有效地使带有空格的$q 的任何值与$letters 不匹配

    这是一个简单的示例,可以满足您的需求

    <?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  
    

    据我所知(“替换重音字符 PHP”的快速谷歌搜索),你有点不走运。 This question 使用strtr 提供快速解决方案,this tip 使用与str_replace 类似的方法。

    不幸的是,这些都依赖于预定义的字符集,因此您没有准备好传入的重音将会失败。您最好依靠用户在搜索时输入特殊字符,或者创建一个具有“可搜索”名称的新列,并尽可能替换重音字符,并将真实名称作为“匹配”显示返回字段。

    补充说明

    found another solution 可以做你想做的大部分事情,除了返回的名字不会有重音。但是,它会将数据库中的重音值与非重音搜索匹配。修改后的代码是:

    <?php
    
    $q = "Joa";
    $name = "João Carlos";
    
    $searchable_name = replace_accents($name);
    
    if(stripos($searchable_name, $q) !== false)
    {
        $result = preg_replace("/($q)/i", '<strong>$1</strong>', $searchable_name);
        print_r($result);
    }
    
    function replace_accents($str) {
        $str = htmlentities($str, ENT_COMPAT, "UTF-8");
        $str = preg_replace('/&([a-zA-Z])(uml|acute|grave|circ|tilde);/','$1',$str);
        return html_entity_decode($str);
    }
    

    【讨论】:

    • 谢谢!这解决了空间问题。有什么想法可以解决重音问题吗?
    • 通过进一步阅读更新了答案 - 解决方案并不漂亮,但很多人已经以某种形式提出了解决方案。
    • @Penny 更新了一个半工作的口音匹配器。重要的是,我不确定如何让重音回到返回字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 2011-08-28
    相关资源
    最近更新 更多