突出显示mysql中的搜索词php搜索重音字符

突出显示mysql中的搜索词php搜索重音字符,php,mysql,search,Php,Mysql,Search,根据这个问题的答案3“我可以实现单词高亮显示,唯一我仍然不知道的是如何高亮显示单词的重音版本,查询确实可以找到例如“wesha”和“weshá”,但高亮显示仅对“wesha”有效。” 这是我的密码: echo "<p>".str_replace($palabra,"<strong>$palabra</strong>",$row['definicion'])."</p>"; echo“”。str_替换($palabra,$palabra”,$row

根据这个问题的答案3“我可以实现单词高亮显示,唯一我仍然不知道的是如何高亮显示单词的重音版本,查询确实可以找到例如“wesha”和“weshá”,但高亮显示仅对“wesha”有效。”

这是我的密码:

echo "<p>".str_replace($palabra,"<strong>$palabra</strong>",$row['definicion'])."</p>";
echo“”。str_替换($palabra,$palabra”,$row['definicion')。“

”;
谢谢


顺便问一下,更改为
stru\ireplace
会使单词与大写字母匹配,但会将它们更改为非大写字母,有没有办法也包括这一点

这是因为数据库在进行搜索时正在进行音译。i、 e.如果搜索“á”,则它会同时获得“á”和“a”(translatit)的匹配项。应用程序代码需要对突出显示的文本进行相同的音译。使用iconv实现此目标:

这里有一个PHP类,它将通过利用PHP类
音译器来突出显示某些HTML文本中出现的所有搜索词,该类自PHP 5.4开始提供,并安装了扩展

这个类将对HTML中的每个字符进行音译,然后对搜索词和音译的HTML进行字符比较。它将使用HTML
span
元素和提供的
$css\u类
突出显示匹配的术语

此类还支持音译产生多个字符的字符,例如日语字符
音译为
shou
,因此字符
手如果搜索词为“应”
,则文本中将突出显示ld

该类仅受PHP的
音译器
类实现的功能限制

//------------------------------------------------------------------------------------------
// highlights all occurrences of an ascii $term_to_highlight in some
// $html string that may contain all sorts of weird characters
class SearchResultHighlighter {
//------------------------------------------------------------------------------------------
    public $term_to_highlight;
    protected $term_len;
    protected static $transliterator = null;

    //------------------------------------------------------------------------------------------
    public function __construct(
        $term_to_highlight,     // must be an already transliterated search term (ASCII only)
        $transliterator_rules   // rules passed to Transliterator::createFromRules
    ) {
        $this->term_to_highlight = $term_to_highlight;
        $this->term_len = mb_strlen($this->term_to_highlight);
        if(self::$transliterator === null) // Transliterator only available PHP >= 5.4.0, PECL intl >= 2.0.0
            self::$transliterator = class_exists('Transliterator') ? Transliterator::createFromRules($transliterator_rules) : null;
    }

    //------------------------------------------------------------------------------------------
    public function highlight(
        $html,              // the HTML in which to highlight all occurrences of $this->term_to_highlight
        $css_class = 'hl'   // the CSS class used to highlight occurrences
    ) {
        if(self::$transliterator === null)
            return $html;
        $result = '';
        $source_len = mb_strlen($html);
        $matched_term_chars = 0;
        $source_match_startpos = 0;
        $source_match_len = 0;
        for($i = 0; $i < $source_len; $i++) {
            $c = mb_substr($html, $i, 1);
            $c_trans = mb_strtolower(self::$transliterator->transliterate($c));
            $c_trans_len = mb_strlen($c_trans); // note: single transliterated chars can be more than one char, e.g. transliterate('手') yields 'shou'
            if($c_trans_len <= $this->term_len - $matched_term_chars && $c_trans === mb_substr($this->term_to_highlight, $matched_term_chars, $c_trans_len))    {
                if($matched_term_chars == 0)
                    $source_match_startpos = $i;
                $matched_term_chars += $c_trans_len;
                $source_match_len++;
                if($matched_term_chars == $this->term_len) {
                    $result .= sprintf('<span class="%s">%s</span>', $css_class, mb_substr($html, $source_match_startpos, $source_match_len));
                    $matched_term_chars = $source_match_len = 0;
                }
            }
            else {
                $result .= $source_match_len > 0 ? mb_substr($html, $source_match_startpos, $source_match_len + 1) : $c;
                $matched_term_chars = $source_match_startpos = $source_match_len = 0;
            }
        }
        return $result;
    }
}

你的意思是当“weshá”出现在$row['definicion']中时,它没有被粗体替换?我说得对吗?不,没有被替换,你说得对……对我来说,它起作用了,我的意思是不替换,但使该词(两者)加粗如果我搜索“wesha”或“weshá”,查询将返回两者,但高亮显示只适用于准确的搜索,我的意思是如果我搜索“weshá”结果,则显示两者,但只突出显示“weshá”,我已将数据库的排序规则从utf8_西班牙语_ci更改为utf8_bin,现在搜索只返回精确匹配,因此突出显示与此一致。这不是更好的解决方案,但至少用户不会感到困惑。但一件坏事是,
stru\ireplace
不再起作用。
$html = '<p>ŁoreM Ìpsum Ðolór. Šit Ämet. Some really long, accénted and diactritical stuff, e.g. the names Ḥasan or Abū ʿĀṣī come with some diacritics. James Bond loves Ms. Pussy Galore!</p>';

$transliteration_rules = ':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: Lower(); :: NFC;';

$highlighter = new SearchResultHighlighter('lore', $transliteration_rules);

echo $highlighter->highlight($html, 'yellow-bold');
<p><span class="yellow-bold">Łoré</span>M Ìpsum Ðolór. Šit Ämet. Some really long, accénted and diactritical stuff, e.g. the names Ḥasan or Abū ʿĀṣī come with some diacritics. James Bond loves Ms. Pussy Ga<span class="yellow-bold">lore</span>!</p>