5

私は、いくつかの場所でアクセント付きの文字と大文字を含む Web サイト用のフランス語の 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+ の別のバリアントがあります。これには 1 つの問題があります。実際には急性症状を取り除きます。部分的な解決策として機能する可能性があります。

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 に答える