gpt4 book ai didi

php - 在 mysql php 搜索重音字符中也突出显示搜索词

转载 作者:行者123 更新时间:2023-11-30 23:06:21 25 4
gpt4 key购买 nike

在这个问题“Highlight search term in mysql php search”的答案 3 之后,我可以实现单词突出显示,唯一我仍然无法弄清楚的是如何突出显示单词的重音版本,查询确实找到了例如“wesha”和“wesha”,但突出显示仅适用于“wesha”..

这是我的代码:

echo "<p>".str_replace($palabra,"<strong>$palabra</strong>",$row['definicion'])."</p>";

谢谢

顺便说一句,更改为 str_ireplace 可以匹配大写的单词,但将它们更改为非大写字母,有没有办法也包括这个?

最佳答案

我知道这是一个老问题,但经过大量搜索后,我没有找到正确答案。所以这就是我在葡萄牙语中的做法,我认为这也适用于其他语言。对于美国或英语读者,这里是问题的描述。

假设我们有一个像“... sobre formação, os cursos são rápidos.”这样的句子我们在“formação”中有“ç”和“ã”,在“rápidos”中有“á”。

如果我们使用 SQL 匹配,当我们搜索“formação”和“Formação”时,我们会看到这句话被视为“正确结果”,这意味着匹配是区分大小写的。

当我们想要高亮时,我们可以使用像这样的正则表达式:

  $sentence =  preg_replace("/($str_regexp)/i","<span style=\"font-weight:bold; color:#005200;\">$0</span>",$sentence);

其中 $str_regexp 是一个包含我们要查找的所有单词的字符串,带有 |作为分隔符。例如“formação|rápidos”

但是如果我们执行 SQL 匹配,我们可以看到这句话也匹配“Formacao”或“rapidos”。对于匹配查询,我们没有“ã”这一事实不是问题。但是当我们想要突出显示时,正则表达式不起作用。它在案例激励中起作用,但对于它来说,“formacao”与“formação”不同,而对于 SQL,它是相同的...

我想这是因为全文索引可能是原始文本的修改副本,没有短词和重音。索引没有短词(2 或 3 个字母)的事实解释(也许)SQL 能够告诉我们“这句话与您正在搜索的词匹配”但无法告诉我们这些词在哪里.

为了在用户查找“formacao”时在原文中突出显示“formação”,我这样做:

function highlight($tab_mot,$text,$start,$end)
{
// Implode the array of searched words and avoid accent
$str_regexp = implode("|",$tab_mot);
$str_regexp = iconv("UTF-8", "US-ASCII//TRANSLIT", $str_regexp);

// Make a copy of the orignal text, but without accente
$text_tmp = iconv("UTF-8", "US-ASCII//TRANSLIT", $text);

// Look for all occurences of the word in case incencitive mode
// With the PREG_OFFSET_CAPTURE we will have in matches, and array
// of the result.
preg_match_all("/$str_regexp/i", $text_tmp, $matches, PREG_OFFSET_CAPTURE);

// Just to see what we get
echo "<pre>";
print_r($matches);
echo "</pre>";

$nb = count($matches[0]); // Number of matches
$idx_offset = 0;
$tab_offset_debut = array();
$tab_offset_fin = array();

for ($x = 0; $x < $nb; $x++)
{
$offset_debut = $matches[0][$x][1]; // Offset to start of word
$tab_offset_debut[$x] = $offset_debut;
// Offset to end is offset from start + length
$tab_offset_fin[$x] = $offset_debut+strlen($matches[0][$x][0]);
}

// We reverse the array. If not when we will perform the change on first
// word, all next offsets would be wrong
rsort($tab_offset_debut,SORT_NUMERIC);
rsort($tab_offset_fin,SORT_NUMERIC);

// Loop againts all offset (so from last to the first)
for ($x = 0; $x < $nb; $x++)
{
$offset_debut = $tab_offset_debut[$x];
$offset_fin = $tab_offset_fin[$x];
// Add tag after and THEN, before to preserve offsets values
$text = mb_substr($text, 0,$offset_fin,'UTF-8').$end.mb_substr($text,$offset_fin);
$text = mb_substr($text, 0,$offset_debut,'UTF-8').$start.mb_substr($text,$offset_debut);
}

echo"<hr>".$text;
return $text; // Return text with highligh

}

参数:

  • tab_mot 是我用于查询的单词数组。
  • text是匹配query的句子
  • start 是我要在要突出显示的单词之前插入的标记
  • end是词尾的标签

所以当文本可以有“formação”时,tab_mot 可以有“formacao”。

我认为有足够的评论可以理解。注意使用 mb_substr 而不是 substr(mb_substr_replace 不存在)。

注意:只是一个细节。为了 iconv 正常工作,不要忘记设置本地使用$ret = setlocale(LC_ALL, "pt_BR.utf-8");//在我的例子中是巴西葡萄牙语

关于php - 在 mysql php 搜索重音字符中也突出显示搜索词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21718781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com