2016-11-03 14 views
3

長い話ですが、私はいくつかの偽のHTMLを取り、JavaScriptを使用して実際のHTMLに置き換える必要があります。例えば:私はおそらくすべての要素の上に配置することができるすべての属性を予測することはできませんとしてこれを行うには正規表現を使用していURLを除く特定のパターンのRegEx

<span class="text-bold" data="attribute">TITLE</span> 

{span class:text-bold data:attribute}TITLE{/span} 

はに変更する必要があります。データのすべてのインスタンスを見つけるために多かれ少なかれ動作している表現:属性:

/(\w+\:)(.[^\s\}]*)/g 

ただし、問題があります。この表現は、例えば、URLが一致します。

http://www.google.ca 

マッチングから任意のURLを除外しようとする試みで、私はそうのような表現を変更:

/(?!http)(\w+\:)(.[^\s\}]*)/g 

しかし、これは期待した効果を持っていませんでした、このパターンは引き続き先頭の 'h'が付いていないURLとの一致を続けます。たとえば、

ttp://www.google.ca 

私はかなり長い間RegExを使用していないことを認めますので、多分誤解していると思います。 RegExパターンを特定の文字セットで始まる一致とマッチさせないようにするにはどうすればよいですか?

+0

完全なコードを追加します(置き換えます)。 – Dekel

+0

あなたの正規表現がデータの周りの '{} 'と一致しないのはなぜですか?あなたの問題を解決できないでしょうか? – Aaron

+0

'\ w +' => '\ b \ w +'の前に単語境界を追加します。また、 ':'と '}'をエスケープする必要はありません。 –

答えて

1

//の直前、つまりコロンの後ろにネガティブな先読みが必要です。

​​

はもちろん、これはまた、合法的に//で始まるすべての属性値をブロックしますが、私はそれが取る価値が危険だと仮定します。

+1

美しく動作します、ありがとう!私は、httpの代わりにhttpとマッチさせようとしたのは馬鹿だと思う。 – CGriffin

+0

/(\ w +)(?::)(?!\/\ /)([^ \ s}] *)/このように、属性とデータを分離したコロンはキャプチャされません。 – CGriffin

0

私はのハンドラ関数にネストされた正規表現に働くだろう正規表現に置き換えます。

document.getElementById('outp').value = document.getElementById('inp').value.replace(
 
    /{([^}]+)}/g, function(m, tag) { 
 
     return '<' + tag.replace(/(\w+):(\S+)/g, '$1="$2"') + '>'; 
 
    });
textarea { 
 
    width:100%; 
 
}
<textarea id="inp" rows="5">{span class:text-bold data:attribute}TITLE{/span} 
 

 
http://www.google.ca</textarea> 
 
<textarea id="outp" rows="5"></textarea>

最初の正規表現{}と内部の機能との間のすべてのインスタンス{([^}]+)}グラブそれらのマッチでのみ機能するので、他のコロンは変更されません。

関連する問題