2012-04-25 9 views
1

javascriptで独自の翻訳機能を構築したいと思います。今、私は、HTML文字列を取り、私のルックアップ機能でそれを変換する関数を記述したいと思いjavascript regexを使用してhtmlを翻訳する

var frenchHello = language.lookup('hello') //'bonjour' 

: は、私はすでに単語や表現を変換する関数language.lookup(キー)を持っています。 html文字列では、この単語が翻訳されるべきであることを指摘する#[translationkey]のような特殊な構文があります。

これは私が望む結果である:

var html = '<div><span>#[hello]</span><span>#[sir]</span>' 
language.translate(html) //'<div><span>bonjour</span><span>monsieur</span> 

にはどうすればlanguage.translateを書きますか? 私の考えは正規表現で私の特別な構文を除外し、各キーでlanguage.lookupを実行することです。たぶん、文字列の置換または何か。

私は正規表現になると私は吸うと私は非常に不完全な例を考え出したが、とにかくそれを含めるので、誰かが私がしようとしているもののアイデアを得るかもしれない。その後、歓迎よりも優れているが完全ではあるが解決策があれば。

var value = "#[hello], nice to see you."; 

lookup = function(word){ 
    return "bonjour"; 
}; 

var res = new RegExp("\\b(hello)\\b", "gi").exec(value) 

for (var c1 = 0; c1 < res.length; c1++){ 
    value = value.replace(res[c1], lookup(res[c1])) 
}  
alert(value) //#[bonjour], nice to see you. 

正規表現はもちろん、言葉ハローが、構文をフィルタリングして、グループ化または類似してキーを収集してはなりません。

誰でも手助けできますか?閉じ角括弧が続く閉じ角括弧を含まないゼロ以上の文字が続くオープニング角括弧が続くハッシュと一致

#\\[[^\\]]*\\] 

、:

答えて

2

ちょうど置換テキストを生成し、グローバルは、あなたの構文に一致する正規表現を使用して置き換える作るために2番目の引数として指定された関数を呼び出すためString.replace方法の能力を使用します。

var value = "#[hello], #[sir], nice to see you."; 

lookup = function(full_match, word){ 
    if(word == 'hello') 
     return "bonjour"; 
    if(word == 'sir') 
     return "monsieur" 
}; 

console.log(value.replace(/#\[(.+?)\]/gi, lookup)) 

結果: bonjour、monsieur、よろしくお願いします。

もちろん、置換リストが大きくなると、ルックアップ関数で一連のifsではなくlookupオブジェクトを使用する方がよいでしょうが、実際には何でもできます。

1

次のようなものを使用することができます。

また、おそらく、サーバー側(おそらくテンプレートエンジンを通じて)で翻訳を処理し、翻訳された応答をクライアントに返すほうがよいでしょう。それ以外の場合は(当然扱っている特定の問題に応じて)、ブラウザに多くのデータを送信することになり、アプリケーションの応答が遅くなる可能性があります。

EDIT:ここ は、コードの作業部分です:

var q="This #[ANIMAL1] was eaten by that #[ANIMAL2]"; 
    var u = {"#[ANIMAL1]":"Lion","#[ANIMAL2]":"Frog"}; 

    function insertAnimal(aString, lookup){ 
     var res = (new RegExp("#\\[[^\\]]*\\]", "gi"))   
     while (m = res.exec(aString)){ 
      aString = aString.replace(m, lookup[m]) 
     }  
     return aString; 
    } 

    function main(){ 
     alert(insertAnimal(q,u));   
    } 

あなたは、私が「解決にあなたの条件を比較することができ、HTMLドキュメントのボディonloadイベント

+0

はい、このサーバー側を行う方が良いです。そうでなければ、クライアントに2つの言語、つまり置き換えられる言語がロードされます。 – Spoike

+0

私はそれがあなたの提案に対応することができないので、完全な実行可能な例への答えを編集してください。 – John

+0

人、使用しますか?修飾語。シンプルな倹約的な修飾語句の代わりに「含まない」という言葉が見えるたびに、私の目は痛みを吐きます。 –

0

から「メイン()」を呼び出すことができますコンテンツ内のテンプレートテキスト 'となります。 Jqueryを使用することが可能な場合は、Handlebars.js を試してください。

1

あなたはすべての出現を検索し、これを試すことができます。

var re = new RegExp('#\\[([^\\]]+?)\\]', 'gi'), 
    str = '#[value1] plain text #[value2]', 
    match; 

while (match = re.exec(str)) { 
    console.log(match); 
} 
+0

私は実際にループ状態のre.exec(str)からヌルを得ます。表現は本当に正しいですか? – John

+0

問題は '[\\]]'にあり、 '。'に置き換えられているようです。 – lazyhammer

+0

OK、エラーがローカライズされ、修正されました:)カッコ内に「^」が見つかりませんでした – lazyhammer

関連する問題