14

アクセントを無視する正規表現を作成する方法はありますか?

例えば:

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

正規表現の「i」は大文字と小文字の区別を無視することですが、たとえば
javaJávãなど、一致するものはありますか?

$str のコピーを作成し、内容をアクセントのない文字列に変更して、すべての出現箇所のインデックスを見つけようとしました。しかし、アクセントがないだけなのに、2 つの文字列のインデックスは異なるようです。

(私は調査を行いましたが、文字列からアクセントを削除する方法しか見つかりませんでした)

4

5 に答える 5

7

そんな方法があるとは思えません。これはロケールに依存するため、パターン文字列で UTF-8 を有効にするには、最初に「/u」スイッチを使用する必要があります。

私はおそらくこのようなことをするでしょう。

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を扱っていたからです。

于 2012-05-07T05:52:38.993 に答える
2

Java と Jávã は異なる単語です。アクセントを削除するための正規表現のネイティブ サポートはありませんが、置換したいアクセント付きまたはなしの文字のすべての可能な組み合わせを正規表現に含めることができます。

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

幸運を!

于 2012-05-07T05:50:41.780 に答える
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>";

?>

このようなものがあなたを助けると思います、私はフォーラムからこれを手に入れました..ちょっと見てください。

于 2012-05-07T06:22:21.343 に答える
1

ここでは、正規表現はあなたのためのツールではありません。

あなたが探している答えはstrtr()機能です。

この関数は、文字列内の指定された文字を置き換え、まさにあなたが探しているものです。

あなたの例では、次のような呼び出しJávãを使用できます。strtr()

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

$outputが含まれるようになりますJava

もちろん、操作$replacementsしたいすべての文字を処理するには、より大きな配列が必要になります。人々がそれをどのように使用しているかのいくつかの例については、私がリンクしたマニュアルページを参照してください。

文字の単純な包括的なリストはないことに注意してください。これは、最初は巨大であり、次に、同じ開始文字を異なるコンテキストまたは言語で異なる方法で翻訳する必要がある場合があるためです。

お役に立てば幸いです。

于 2012-05-07T06:05:04.677 に答える
0

適切なロケール (たとえば、fr_FR など) を設定し、strcoll関数を使用して、アクセントを無視して文字列を比較します。

于 2012-05-07T06:26:23.713 に答える