2012-10-02 62 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更改为别的只是改变功能名称...

相关问题