Regex игнорировать акценты? PHP

Есть ли способ заставить Regex игнорировать акценты?

Например:

preg_replace("/$word/i", "<b>$word</b>", $str); 

«I» в регулярном выражении состоит в том, чтобы игнорировать регистр, чувствительный к регистру, но есть все равно, чтобы соответствовать, например
java с Jávã ?

Я попытался сделать копию $ str, изменить содержимое на строку без акцента и найти индекс всех вхождений. Но индекс 2 строк кажется другим, хотя это просто без акцентов.

(Я сделал исследование, но все, что я мог найти, – как удалить акценты из строки)

Я не думаю, что есть такой путь. Это будет зависящим от языка, и вы, вероятно, сначала захотите переключить переключатель «/ u», чтобы включить UTF-8 в строки шаблонов.

Я бы, наверное, сделал что-то подобное.

 function prepare($pattern) { $replacements = Array("a" => "[áàäâ]", "e" => "[éèëê]" ...); return str_replace(array_keys($replacements), $replacements, $pattern); } pcre_replace("/(" . prepare($word) . ")/ui", "<b>\\1</b>", $str); 

В вашем случае индекс был другим, потому что, если вы не использовали mb_string вы, вероятно, имели дело с UTF-8, который использует более одного байта на символ.

Java и Jávã – разные слова, в regex нет встроенной поддержки для удаления акцентов, но вы можете включать все возможные комбинации символов с акцентами или без них, которые вы хотите заменить в своем регулярном выражении.

Как и preg_replace("/java|Jávã|jáva|javã/i", "<b>$word</b>", $str); ,

Удачи!

Regex – это не инструмент для вас здесь.

Ответ, который вы ищете, это strtr() .

Эта функция заменяет указанные символы в строке и именно то, что вы ищете.

В вашем примере Jávã вы можете использовать strtr() следующим образом:

 $replacements = array('á'=>'a', 'ã'=>'a'); $output = strtr("Jávã",$replacements); 

$output теперь будет содержать Java .

Конечно, вам понадобится большой массив $replacements для обработки всех персонажей, с которыми вы хотите работать. См. Страницу руководства, с которой я связан, для некоторых примеров того, как люди ее используют.

Обратите внимание, что нет простого списка символов, потому что во-первых, он будет огромным, и, во-вторых, один и тот же стартовый символ может быть переведен по-разному в разных контекстах или языках.

Надеюсь, это поможет.

 <?php if (!function_exists('htmlspecialchars_decode')) { function htmlspecialchars_decode($text) { return str_replace(array('&lt;','&gt;','&quot;','&amp;'),array('<','>','"','&'),$text); } } function removeMarkings($text) { $text=htmlentities($text); // components (key+value = entity name, replace with key) $table1=array( 'a'=>'grave|acute|circ|tilde|uml|ring', 'ae'=>'lig', 'c'=>'cedil', 'e'=>'grave|acute|circ|uml', 'i'=>'grave|acute|circ|uml', 'n'=>'tilde', 'o'=>'grave|acute|circ|tilde|uml|slash', 's'=>'zlig', // maybe szlig=>ss would be more accurate? 'u'=>'grave|acute|circ|uml', 'y'=>'acute' ); // direct (key = entity, replace with value) $table2=array( '&ETH;'=>'D', // not sure about these character replacements '&eth;'=>'d', // is an ð pronounced like a 'd'? '&THORN;'=>'B', // is a þ pronounced like a 'b'? '&thorn;'=>'b' // don't think so, but the symbols looked like ad,b so... ); foreach ($table1 as $k=>$v) $text=preg_replace("/&($k)($v);/i",'\1',$text); $text=str_replace(array_keys($table2),$table2,$text); return htmlspecialchars_decode($text); } $text="Here two words, one in normal way and another in accent mode java and jává and me searched with java and it found both occurences(higlighted form this sentence) java and jává<br/>"; $find="java"; //The word going to higlight,trying to higlight both java and jává by this seacrh word $text=utf8_decode($text); $find=removeMarkings(utf8_decode($find)); $len=strlen($find); preg_match_all('/\b'.preg_quote($find).'\b/i', removeMarkings($text), $matches, PREG_OFFSET_CAPTURE); $start=0; $newtext=""; foreach ($matches[0] as $m) { $pos=$m[1]; $newtext.=substr($text,$start,$pos-$start); $newtext.="<b>".substr($text,$pos,$len)."</b>"; $start=$pos+$len; } $newtext.=substr($text,$start); echo "<blockquote>",$newtext,"</blockquote>"; ?> - <?php if (!function_exists('htmlspecialchars_decode')) { function htmlspecialchars_decode($text) { return str_replace(array('&lt;','&gt;','&quot;','&amp;'),array('<','>','"','&'),$text); } } function removeMarkings($text) { $text=htmlentities($text); // components (key+value = entity name, replace with key) $table1=array( 'a'=>'grave|acute|circ|tilde|uml|ring', 'ae'=>'lig', 'c'=>'cedil', 'e'=>'grave|acute|circ|uml', 'i'=>'grave|acute|circ|uml', 'n'=>'tilde', 'o'=>'grave|acute|circ|tilde|uml|slash', 's'=>'zlig', // maybe szlig=>ss would be more accurate? 'u'=>'grave|acute|circ|uml', 'y'=>'acute' ); // direct (key = entity, replace with value) $table2=array( '&ETH;'=>'D', // not sure about these character replacements '&eth;'=>'d', // is an ð pronounced like a 'd'? '&THORN;'=>'B', // is a þ pronounced like a 'b'? '&thorn;'=>'b' // don't think so, but the symbols looked like ad,b so... ); foreach ($table1 as $k=>$v) $text=preg_replace("/&($k)($v);/i",'\1',$text); $text=str_replace(array_keys($table2),$table2,$text); return htmlspecialchars_decode($text); } $text="Here two words, one in normal way and another in accent mode java and jává and me searched with java and it found both occurences(higlighted form this sentence) java and jává<br/>"; $find="java"; //The word going to higlight,trying to higlight both java and jává by this seacrh word $text=utf8_decode($text); $find=removeMarkings(utf8_decode($find)); $len=strlen($find); preg_match_all('/\b'.preg_quote($find).'\b/i', removeMarkings($text), $matches, PREG_OFFSET_CAPTURE); $start=0; $newtext=""; foreach ($matches[0] as $m) { $pos=$m[1]; $newtext.=substr($text,$start,$pos-$start); $newtext.="<b>".substr($text,$pos,$len)."</b>"; $start=$pos+$len; } $newtext.=substr($text,$start); echo "<blockquote>",$newtext,"</blockquote>"; ?> 

Я думаю, что что-то вроде этого поможет вам, я получил это с форума .. просто взгляните.

Установите соответствующий язык (например, fr_FR, например) и используйте функцию strcoll для сравнения строки, игнорирующей акценты.