我正在为一个网站构建法语MySQL数据库,该网站将在某些地方包含重音字符和大写字母。所有这一切都很完美。
现在我设计了一个表格,显示了数据库的内容(工作正常),并在其上面放了一个搜索栏。用于搜索的SQL查询按预期工作(使用LIKE,它不区分大小写并将重音字符视为基本字母,这非常令人惊讶地完全符合我的要求)。
这是我的问题:我想直接在表格中突出显示所有搜索实例。我得到了部分工作:
str_ireplace($_POST["search"],
'<span class="highlight">' . $_POST["search"] . "</span>",
$row['First_Name']);
但是会出现这些问题:
我一直在寻找过去3个小时没有运气的解决方案。我开始阅读preg_replace()
,但似乎无法找到正确的方法,而不用手写每个可能的重音字符的无限代码。如果我可以模仿SQL Query使用“LIKE”做什么但是在php或其他东西中会很棒。
答案 0 :(得分: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’<span class="highlight">école</span> !
Allons à l’<span class="highlight">École</span> !
Allons à l’<span class="highlight">école</span> !
答案 1 :(得分: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";
答案 2 :(得分:-1)
考虑使用正则表达式来忽略重音。这样的事情:
$value = 'É ç école';
echo preg_replace("/&([a-z])[a-z]+;/i", "$1", htmlentities($value));