1

我有一个名为 AccentToRegex 的函数,它应该将重音和非重音字母替换为正则表达式。唯一的问题是,如果我想将“s”替换为“[sš]”,将“š”替换为“[sš]”(同样的事情)。该函数逐个字符地运行,当我输入“s”时,我最终得到类似 [s[sš]] 的内容,但是我想更改它,所以它只返回“[sš]”。

我正在考虑使用修改后的值运行 str_replace 两次,但这似乎效率低下。

所以问题是如何将函数从逐个字符运行并检查已插入的字符更改为忽略插入的字符。

例子。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 回答