2012-10-02 69 views
0

我用這個代碼:如何使用Javascript轉換替換函數來替換多個字符?

<script type="text/javascript"> 
    function transfer(which) { 
     which = which.replace(/[\-]+/g,'-'); // to remove extra hypens 
       which = which.replace('č', 'c'); 
       which = which.replace('ē', 'e'); 
       which = which.replace('ģ', 'g'); 
       which = which.replace('ī', 'i'); 
       which = which.replace('ķ', 'k'); 
       which = which.replace('ļ', 'l'); 
       which = which.replace('ņ', 'n'); 
       which = which.replace('ū', 'u'); 
       which = which.replace('ž', 'z'); 
       which = which.replace('š', 's'); 
       which = which.replace('ā', 'a'); 
     which = which.replace(/\s/g,'-'); // to replace spaces with hypens 
     which = which.replace(/[\-]+/g,'-'); // to remove extra hypens 
     which = which.replace(/[^a-zA-Z0-9\-]/g,'').toLowerCase(); // to convert to lower case 
     document.getElementById("url_slug").value = which; 
    } 
</script> 

正如你看到的,現在也有很多變化的人物,但我也需要更改所有俄語字符拉美。如果我這樣做,我會很長的代碼。 所以我的問題是:是否有可能用Javascript轉換替換函數替換許多字符不是每行一個字符。類似 喜歡的東西在PHP

$cyr = array('а','б','в','г','д','e','ж','з','и','й','к','л','м','н','о','п','р','с','т','у', 
     'ф','х','ц','ч','ш','щ','ъ','ь', 'ю','я','А','Б','В','Г','Д','Е','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У', 
     'Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ь', 'Ю','Я'); 
     $lat = array('a','b','v','g','d','e','zh','z','i','y','k','l','m','n','o','p','r','s','t','u', 
     'f' ,'h' ,'ts' ,'ch','sh' ,'sht' ,'a' ,'y' ,'yu' ,'ya','A','B','V','G','D','E','Zh', 
     'Z','I','Y','K','L','M','N','O','P','R','S','T','U', 
     'F' ,'H' ,'Ts' ,'Ch','Sh' ,'Sht' ,'A' ,'Y' ,'Yu' ,'Ya'); 
     $textcyr = str_replace($cyr, $lat, $textcyr); 

回答

0

沒有在JavaScript中沒有內置函數來做到這一點,但你可以很容易地創建自己的。在對象中創建俄語到拉丁語的映射,然後使用for..in在該對象上循環。對於循環處理的每個鍵值對,進行替換。

function transfer(which) { 
    // define a Russian-to-Latin mapping object 
    var map = { 
       'б':'b', 
       'в':'v', 
       // all the rest ... 
       }; 

    // replace non-Latin chars with Latin replacements 
    for(cyr in map) { 
     var lat = map[cyr]; 
     which = which.replace(new RegExp(cyr, 'g'), lat); 

     // Or without RexExp: 
     // which = which.split(cyr).join(lat); 
    } 

    // general cleanup 
    which = which.replace(/\s/g,'-')  // spaces to hyphens 
       .replace(/[\-]+/g,'-') // remove duplicate hyphens 
       .replace(/[^a-zA-Z0-9\-]/g,'').toLowerCase(); 

    // show the result 
    document.getElementById("url_slug").value = which; 
} 

注意,當replace與字符串作爲第一個參數使用時,它僅替換字符串的第一個實例(例如,"aaa".replace('a','b')返回"baa",不"bbb")。您需要使用全局正則表達式多次替換字符串,就像我在示例中所做的那樣。只要確保你的俄羅斯沒有像^,$,(,)等任何特殊的正則表達字符(但從你的例子中,我猜這不會是一個問題)。 或者,您可以使用我添加的split/join解決方案作爲註釋。

根據您的需要,您可以提供map對象作爲參數,而不是將其內置到函數中。

+0

謝謝。它工作的很好,但只有如何實現這個代碼:\t \t which = which.replace(/ \ s/g,' - '); //替換空格 which = which.replace(/ [\ - ] +/g,' - '); //去除額外的多餘信息 which = which.replace(/ [^ a-zA-Z0-9 \ - ]/g,'')。toLowerCase(); //將其轉換爲小寫 – Dainis

+0

我在某些代碼中編輯了這個代碼 - 您可以將「替換」調用鏈接在一起,就像我在「常規清理」部分所做的那樣。這樣,你不必多次寫出「哪個= which.replace(...);'」;您只需添加更多'.replace(...)'調用。沒有辦法使它比這更短,因爲「替代連字符」替換必須在「刪除重複連字符」替換之前發生。 – apsillers

+0

謝謝。但是這段代碼沒有奏效。隨着第一個代碼都工作,除了空間卸妝。也許有可能以某種方式改變? – Dainis

0

朋友,在JavaScript中沒有內置方法,如str_replace ...但您可以通過創建此名稱中的函數來創建此方法...將下面的函數附加到您的javascript文件或script標記中你的HTML頁面...

function str_replace(search, replace, subject){ // same as php 
    for(var i=0;i<search.length;i++){ 
     subject=subject.replace(new RegExp(search[i],"g"),replace[i]); 
    } 
    return subject; 
} 

如何使用:

var cyr = ['а','б','в','г','д','e','ж','з','и','й','к','л','м', 
      'н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ', 
      'ъ','ь','ю','я','А','Б','В','Г','Д','Е','Ж','З','И', 
      'Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х', 
      'Ц','Ч','Ш','Щ','Ъ','Ь', 'Ю','Я'], 
    lat = ['a','b','v','g','d','e','zh','z','i','y','k','l','m', 
      'n','o','p','r','s','t','u','f','h','ts','ch','sh', 
      'sht','a','y','yu','ya','A','B','V','G','D','E','Zh', 
      'Z','I','Y','K','L','M','N','O','P','R','S','T','U', 
      'F' ,'H' ,'Ts','Ch','Sh','Sht','A','Y','Yu','Ya']; 

textcyr = str_replace(cyr, lat, textcyr); 

,如果你想方法名str_replace更改爲別的只是改變功能名稱...

相關問題