1

私はaccentToRegexという関数を持っています。これは、アクセントのある文字とアクセントのない文字を正規表現に置き換えることになっています。唯一の問題は、"s" を "[sš]" に、"š" を "[sš]" に置き換えたい場合 (同じこと) です。関数は char ごとに実行され、「s」を入力すると [s[sš]] のような結果になりますが、これを変更したいので、「[sš]」のみが返されます。

値を変更して str_replace を 2 回実行することを考えていましたが、効率が悪いようです。

したがって、問題は、関数を char ごとに実行し、既に挿入された文字をチェックすることから、挿入された文字を無視するように変更する方法です。

例。input="s" -> "[sš]" に変更 -> "š" を "[sš]" に変更して、"[sš]" ではなく [s[sš]] を取得します。

function accentToRegex($pattern)
    {
       $replacements = Array("a" => "[aáàäâ]",
                             "e" => "[eéèëê]",
                             "s" => "[sš]",
                             "š" => "[sš]",
                              ....
                             );
       $flags = "iu";
       $times = 0;
       $final = str_replace( array_keys($replacements), $replacements, $pattern);  
       $regex = "/$final/$flags";
       return $regex;
    }

あなたの時間と助けをありがとう、私はそれを感謝します;)

4

2 に答える 2

0

strtr()関数のコメントに回答があり、この関数は gr_regexp(..) と呼ばれます。

function accentToRegex($mystring){
    $replacement=array(
            array("a","á","ä"),
            array("s", "š"),
    );
    foreach($replacement as $group){
            foreach($group as $character){
                    $exp="[";
                    foreach($group as $expcharacter){
                            $exp.=$expcharacter;
                    }
                    $exp.="]";
                    $trans[$character]=$exp;
            }
    }
    $temp=explode(" ", $mystring);
    for ($i=0;$i<sizeof($temp);$i++){
            $temp[$i]=strtr($temp[$i],$trans);
            $temp[$i]=addslashes($temp[$i]);
    }
    $flags = "iu";
    return "/".implode(".*",$temp)."/$flags";
    }
于 2013-02-26T13:53:59.827 に答える
0

関数を次のように置き換えます。

function accentToRegex($pattern)
{
    $replacements = Array("a" => "[aáàäâ]",
                          "e" => "[eéèëê]",
                          "s" => "[sš]",
                          "š" => "[sš]",
                          );
    $flags = "iu";
    $times = 0;
    $final = strtr($pattern, $replacements);  
    $regex = "/$final/$flags";
    return $regex;
}
于 2013-02-26T13:55:54.800 に答える