2013-02-26 74 views
1

我有一个名为accentToRegex的函数,它应该将重音和非重音字母替换为正则表达式。唯一的问题是,如果我想将“s”替换为“[sš]”和“š”替换为“[sš]”(同样的东西)。这个函数按字符运行char,并且当我输入“s”时,我最终得到了类似[s [sš]]的东西,但是我想改变它,所以它只返回“[sš]”。PHP生成正则表达式

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

所以问题是如何改变从char运行char函数和检查已插入的字符忽略insterted字符。

例子。输入=“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; 
    } 

感谢您的时间和帮助,我很感激;)在strtr()功能评论发现

+1

参见[strtr函数的效率()](http://www.php.net/manual/en/function.strtr.php)功能 - 评论部分中的一个例子几乎就是你要找的东西。 – SDC 2013-02-26 13:38:18

+0

非常感谢 – Miso 2013-02-26 13:51:21

回答

0

应答时,函数被调用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"; 
    } 
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; 
}