在PHP中“喜欢”搜索和突出显示

时间:2011-07-18 19:47:10

标签: php search highlighting

我有品牌列表,并希望提供突出显示的搜索功能。例如,有以下品牌

  • 苹果
  • Cewe Color
  • 欧莱雅
  • 微软
  • 麦当劳
  • Tom Tailor

然后,用户在搜索表单中输入lor。我正在使用以下代码段进行搜索

class search {
  private function simplify($str) {
    return str_replace(array('&',' ',',','.','?','|','\'','"'), '', iconv('UTF-8', 'ASCII//TRANSLIT', $str));
  }
  public function do_search($search) {
    $search = self::simplify($search);
    $found = array();
    foreach (self::$_brands as $brand) {
      if (mb_strstr(self::simplify($brand['name']), $search) !== false) $found[]= $brand;
    }
    return $found;
  }
}

这让我:

  • Cewe Color
  • 欧莱雅
  • Tom Tailor

如何突出显示?像:

  • Cewe Co<b>lor</b>
  • L'<b>Oré</b>al
  • Tom Tai<b>lor</b>
顺便说一下:我知道,大多数事情都可以通过str_replace()来完成,但这并不适合我的需要

3 个答案:

答案 0 :(得分:2)

$highlighted = str_replace($search, "<b>$search</b>", $brand);

将是最简单的方法。

答案 1 :(得分:1)

:)

enter image description here

也适用于FedEx;)

enter image description here

$_brands = array
(
"Apple",
"Cewe Color",
"L'Oréal",
"Microsoft",
"McDonald's",
"Tom Tailor"
);

$q = 'lor';
$search = clean($q);

foreach($_brands as $key => $brand){
    $brand = clean($brand);
    $x = stripos($brand, $search);
    if($x !== false){

        $regexp = NULL;
        $l = strlen($q);

        for($i = 0; $i < $l; $i++){
            $regexp .= mb_strtoupper($q[$i]).'.?';
        }
        $regexp = substr($regexp, 0, strlen($regexp) - 2);

        $new = $_brands[$key];
        $new = preg_replace('#('.$regexp.')#ui', '<b>$0</b>', $new);
        echo $new."<br />";

    }

}

function clean($string){
    $string = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $string);
    $string = preg_replace('#[^\w]#ui', '', $string);
    return $string;
}

答案 2 :(得分:0)

self::$_brands包含数据库的结果(包含列namename_lowername_translitname_simplified

class search {
    private function translit($str) {
        return iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', str_replace(array('ä', 'ü', 'ö', 'ß'), array('a', 'u', 'o', 's'), mb_strtolower($str)));
    }

    private function simplify($str) {
        return preg_replace('/([^a-z0-9])/ui', '', self::translit($str));
    }

    public function do_search($simplified) {
        $found = array();
        foreach (self::$_brands as $brand) {
            if (mb_strstr($brand['name_simplified'], $simplified) !== false) $found[]= $brand;
        }
        return $found;
    }

    private function actionDefault() {
        $search = $_POST['search_fld'];
        $simplified = self::simplify($search);
        $result = self::do_search($simplified);
        $brands = array();
        foreach ($result as $brand) {
            $hl_start = mb_strpos($brand['name_simplified'], $simplified);
            $hl_len = mb_strlen($simplified);
            $brand_len = mb_strlen($brand['name']);
            $tmp = '';
            $cnt_extra = 0;
            $start_tag = false;
            $end_tag = false;
            for ($i = 0; $i < $brand_len; $i++) {
                if (($i - $cnt_extra) < mb_strlen($brand['name_simplified']) && mb_substr($brand['name_translit'], $i, 1) != mb_substr($brand['name_simplified'], $i - $cnt_extra, 1)) $cnt_extra++;
                if (($i - $cnt_extra) == $hl_start && !$start_tag) {
                    $tmp .= '<b>';
                    $start_tag = true;
                }
                $tmp .= mb_substr($brand['name'], $i, 1);
                if (($i - $cnt_extra + 1) == ($hl_start + $hl_len) && !$end_tag) {
                    $tmp .= '</b>';
                    $end_tag = true;
                }
            }
            if ($start_tag && !$end_tag) $tmp .= '</b>';
            $brands[] = "<a href=\"/brand/" . rawurlencode($brand['name']) . "\">" . $tmp . "</a>";
        }
        echo implode(' | ', $brands);
    }
}