Regex pour ignorer les accents? PHP

y a-t-il de toute façon pour faire un Regex qui ignore les accents?

Par exemple:

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

le" i " dans le regex est d'ignorer les cas sensibles, mais est là de toute façon pour correspondre, par exemple

java Jávã?

j'ai essayé de faire une copie de la $str, changer le contenu en une chaîne sans accent et trouver l'index de toutes les occurrences. Mais l'indice de la 2 cordes semble être différent, même si c'est juste avec pas d'accents.

(j'ai fait une recherche, mais tout ce que je pourrais trouver est de savoir comment supprimer les accents d'une chaîne de caractères)

13
demandé sur eSinxoll 2012-05-07 09:44:03

5 réponses

Je ne pense pas, il y a un tel moyen. Cela dépend de la localisation et vous voulez probablement un commutateur "/ u " pour activer UTF-8 dans les chaînes de pattern.

function prepare($pattern)
{
   $replacements = Array("a" => "[áàäâ]",
                         "e" => "[éèëê]" ...);
   return str_replace(array_keys($replacements), $replacements, $pattern);  
}

pcre_replace("/(" . prepare($word) . ")/ui", "<b>\1</b>", $str);

dans votre cas, l'index était différent, parce qu'à moins que vous n'utilisiez mb_string Vous avez probablement affaire à L'UTF-8 qui utilise plus d'un octet par personnage.

7
répondu Tibor 2012-05-07 17:39:51

Java et Jávã sont des mots différents, il n'y a pas de support natif dans regex pour supprimer les accents, mais vous pouvez inclure toutes les combinaisons possibles de caractères avec ou sans accents que vous voulez remplacer dans votre regex.

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

Bonne chance!

2
répondu neevek 2012-05-07 05:50:41

Regex n'est pas l'outil pour vous ici.

La réponse que vous cherchez est l' strtr() fonction.

cette fonction remplace les caractères spécifiés dans une chaîne de caractères, et est exactement ce que vous recherchez.

dans votre exemple,Jávã, vous pouvez utiliser un strtr() appel comme ceci:

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

$output contient maintenant Java.

bien sûr, vous aurez besoin d'un plus grand $replacements tableau de traiter avec tous les personnages souhaitez travailler. Voir la page de manuel que j'ai liée pour quelques exemples de la façon dont les gens l'utilisent.

notez Qu'il n'y a pas une simple liste générale de caractères, parce que d'abord ce serait énorme, et ensuite, le même caractère de départ pourrait avoir besoin d'être traduit différemment dans différents contextes ou langues.

j'Espère que vous aide.

1
répondu Spudley 2012-05-07 06:05:04
<?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",'',$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>";

?>

je pense que quelque chose comme ça va vous aider, j'ai obtenu celui-ci d'un forum.. il suffit de prendre un coup d'oeil.

1
répondu arun 2012-05-07 06:22:21

définissez une locale appropriée (comme fr_FR, par exemple) et utilisez strcoll fonction pour comparer une chaîne ignorant les accents.

0
répondu Niet the Dark Absol 2012-05-07 06:26:23