Подтвердить что ты не робот

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

В любом случае, чтобы создать Regex, игнорирующий акценты?

Например:

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

"i" в регулярном выражении состоит в том, чтобы игнорировать регистр, но он все равно соответствует, например,
java с Jávã?

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

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

4b9b3361

Ответ 1

Я не думаю, что есть такой путь. Это будет зависящим от языка, и вы, вероятно, сначала захотите "/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, который использует более одного байта на символ.

Ответ 2

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

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

Удачи!

Ответ 3

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

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

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

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

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

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

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

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

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

Ответ 4

<?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 a d,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>";

?>

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

Ответ 5

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