正则表达式忽略重音? PHP

时间:2012-05-07 05:44:03

标签: php regex preg-replace diacritics

有没有制作一个忽略重音的正则表达式?

例如:

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

正则表达式中的“i”是忽略区分大小写,但无论如何要匹配,例如
java Jávã

我确实尝试制作$ str的副本,将内容更改为无重音字符串并找到所有出现的索引。但是2个字符串的索引似乎是不同的,即使它只是没有重音符。

(我做了一项研究,但我所能找到的是如何从字符串中删除重音)

5 个答案:

答案 0 :(得分:7)

我不认为,有这样的方式。这将是与语言环境相关的,你可能首先想要一个“/ 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。

答案 1 :(得分:2)

Java和Jávã是不同的单词,正则表达式中没有用于删除重音的本机支持,但是您可以包含要在正则表达式中替换的带或不带重音的所有可能的字符组合。

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

祝你好运!

答案 2 :(得分:1)

正则表达式不适合你。

您正在寻找的答案是strtr()功能。

此函数替换字符串中的指定字符,正是您正在寻找的。

在您的示例Jávã中,您可以使用strtr()这样的调用:

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

$output现在将包含Java

当然,您需要一个更大的$replacements数组来处理您想要使用的所有字符。有关人们如何使用它的一些示例,请参阅我链接的手册页。

请注意,没有简单的一揽子字符列表,因为首先它会很大,其次,相同的起始字符可能需要在不同的上下文或语言中进行不同的翻译。

希望有所帮助。

答案 3 :(得分:1)

<?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>";

?>

我认为这样的事情会对你有所帮助,我从一个论坛得到了这个......只是看一看。

答案 4 :(得分:0)

设置适当的区域设置(例如fr_FR)并使用strcoll函数比较忽略重音的字符串。