0

私はこのコードを使用します:

<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転送置換関数で1行に1文字ではなく多くの文字を置き換えることは可能ですか?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);
4

2 に答える 2

0

友人、javascript のような組み込みメソッドはありません...しかし、この名前で関数を作成することによってこのメソッドを作成できます...この関数を javascript ファイルまたはhtml ページstr_replaceのタグの下に添付します...script

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、関数名を変更するだけです...

于 2012-10-03T08:46:39.993 に答える
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"^$()splitjoin

map必要に応じて、関数に組み込むのではなく、オブジェクトを引数として提供できます。

于 2012-10-02T17:42:03.980 に答える