2013-02-26 78 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; 
}