"лайк" поиск и подсветка в PHP - PullRequest
2 голосов
/ 18 июля 2011

У меня есть список брендов и я хочу предоставить функцию поиска с подсветкой. Например, есть следующие бренды

  • Apple
  • Cewe Color
  • L'Oréal
  • Microsoft
  • Макдональдс
  • Том Тейлор

Затем пользователь вводит 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
  • L'Oréal
  • Том Тейлор

Как будет возможно выделение? Как:

  • Cewe Co<b>lor</b>
  • L'<b>Oré</b>al
  • Tom Tai<b>lor</b>

Кстати: я знаю, что большинство вещей можно сделать с помощью str_replace(), но это не всегда соответствует моим потребностям

Ответы [ 3 ]

2 голосов
/ 18 июля 2011
$highlighted = str_replace($search, "<b>$search</b>", $brand);

будет самым простым методом.

1 голос
/ 19 июля 2011

:)

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;
}
0 голосов
/ 19 июля 2011

self::$_brands содержит результат из базы данных (содержит столбцы name, name_lower, name_translit, name_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);
    }
}
...