5

我正在为一个网站构建一个法语 MySQL 数据库,该数据库将在某些地方包含重音字符和大写字母。所有这一切都完美无缺。

现在我设计了一个显示数据库内容的表格(工作完美),并在其顶部放置了一个搜索栏。用于搜索的 SQL 查询按预期工作(使用 LIKE,它不区分大小写,并将重音字符视为其基本字母,这令人惊讶地正是我想要的)。

这是我的问题:我想直接在表格中突出显示所有搜索实例。我得到了它的部分工作:

str_ireplace($_POST["search"], 
             '<span class="highlight">' . $_POST["search"] . "</span>",
             $row['First_Name']);

但是会出现这些问题:

  • 它根据搜索输入更改表中的大写字母
  • 如果用户忽略重音字符(在查找“école”时搜索“ecole”),则搜索不起作用

在过去的 3 个小时里,我一直在寻找解决方案,但没有任何运气。我开始阅读preg_replace()但似乎无法找到正确的方法,除非手动为每个可能的重音字符编写无尽的代码。如果我可以模仿 SQL 查询对“LIKE”所做的事情,但在 php 或其他东西中,那就太好了。

4

3 回答 3

3

这样做的方式,您将始终显示用户输入的内容,而且确实 PHP 不会像 MySQL 那样进行宽松的比较LIKE

这是我编写的一个处理这个问题的函数,包括大多数法语重音字符。

function highlight_substring( $string, $substring )
{
  if( empty( $string ) || empty( $substring ) ) return false;

  $normal = array( 'à', 'é', 'è', 'ê', 'ë', 'î', 'ï', 'ô', 'ò', 'ö', 'û', 'ü', 'ù', 'ç' );
  $flat = array( 'a', 'e', 'e', 'e', 'e', 'i', 'i', 'o', 'o', 'o', 'u', 'u', 'u', 'c' );

  $str = mb_strtolower( $string );
  $str = str_replace( $normal, $flat, $str );

  $sub = mb_strtolower( $substring );
  $sub = str_replace( $normal, $flat, $sub );

  $pos = mb_strpos( $str, $sub );

  if( $pos !== false )
  {
    $var = mb_substr( $string, 0, $pos ).'<span class="highlight">'.mb_substr( $string, $pos, mb_strlen( $substring ) ).'</span>';
    $var .= mb_substr( $string,( bcadd( mb_strlen( $substring ), $pos ) ) );
    $string = $var;
  }

  return $string;
}

随意适应和改进;)

用法

echo highlight_substring( 'Allons à l’école !', 'ecole' ); // user input 'ecole'
echo highlight_substring( 'Allons à l’École !', 'ecole' ); // user input 'ecole'
echo highlight_substring( 'Allons à l’école !', 'Ecole' ); // user input 'Ecole'

将输出:

Allons à l’&lt;span class="highlight">école</span> !
Allons à l’&lt;span class="highlight">École</span> !
Allons à l’&lt;span class="highlight">école</span> !
于 2013-10-19T00:54:29.973 回答
1

这是 PHP 5.3+ 的另一种变体,它有一个问题 - 它实际上消除了急性,也许它可以作为部分解决方案

mb_regex_encoding('utf-8');
mb_internal_encoding('utf-8');

$row = array('First_Name' => 'some École text with école ecole end of some text ');

function highlightString($string, $word)
{
    $string = iconv('utf-8', 'ISO-8859-1//IGNORE', Normalizer::normalize($string, Normalizer::FORM_D));
    $word = iconv('utf-8', 'ISO-8859-1//IGNORE', Normalizer::normalize($word, Normalizer::FORM_D));
    return mb_ereg_replace_callback('('.$word.')', function ($m) { return '<span class=\"highlight\">'.$m[0].'</span>';}, $string, 'msri'); // it is not very secure to use data from POST directly
}

echo highlightString($row['First_Name'], 'école') . " <br>\n";
echo highlightString($row['First_Name'], 'ecole'). " <br>\n";
于 2013-10-19T01:40:11.720 回答
-1

考虑使用正则表达式来忽略重音。像这样的东西:

$value = 'É ç école';

echo preg_replace("/&([a-z])[a-z]+;/i", "$1", htmlentities($value));
于 2013-10-19T01:03:00.903 回答