【问题标题】:How to use Javascript transfer replace function to replace multiply characters?如何使用 Javascript 转移替换功能来替换多个字符?
【发布时间】:2012-09-23 14:25:21
【问题描述】:

我使用这个代码:

<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);

【问题讨论】:

    标签: php javascript replace


    【解决方案1】:

    朋友,在 javascript 中没有像 str_replace 这样的内置方法...但是您可以通过使用此名称创建函数来创建此方法...在您的 javascript 文件或 @987654322 下附加以下函数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 更改为其他名称,只需更改函数名称...

    【讨论】:

      【解决方案2】:

      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 对象作为参数,而不是将其内置到函数中。

      【讨论】:

      • 谢谢。它工作得很好,但只有如何在这段代码中实现:which = which.replace(/\s/g,'-'); // 用连字符替换空格 which = which.replace(/[\-]+/g,'-'); // 删除多余的连字符 which = which.replace(/[^a-zA-Z0-9\-]/g,'').toLowerCase(); // 转换为小写
      • 我为此编辑了一些代码——您可以将replace 调用链接在一起,就像我在“常规清理”部分中所做的那样。这样,您不必多次写出“which = which.replace(...);”;您只需添加更多 .replace(...) 电话。没有办法让它比这更短,因为“空格到连字符”替换必须在“删除重复连字符”替换之前发生。
      • 谢谢。但是这次代码没有用。除了空间去除器之外,第一个代码都可以工作。也许有可能以某种方式改变?
      • 我的原始代码以 return which 结尾,但后来我更改了它以匹配您在原始代码中使用的最后 getElementById 行。这可能是问题吗? (顺便说一句,我添加了一个更安全的解决方案,它不需要将字符串传递给 RegExp 构造函数。)
      猜你喜欢
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 2017-12-06
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多