2011-06-30 12 views
1

何らかの理由で、1行に1つのHTMLタグが必要です。したがって、次の場合は、入力された:1行あたり1つのhtmlタグの正規表現

<p><div class="class1 <%= "class3" %>class2">div content</div></p> 

出力は次のようになります。

<p> 
<div class="class1 <%= "class3" %>class2">div content 
</div> 
</p> 

正規表現は、ERBのスクリプトタグとHTMLタグの違いを認識することができるはずです。インデントは必要ありません。

はどのようにこれは、正規表現を介して行うことができますか?

+2

参照:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+3

正規表現はこれに対して間違ったツールであり、サンプルコードは完璧ですそれのイラストレーション。あなたの例は、あらゆる正気のない正規表現を壊し、あなたが進むにつれてより複雑になります。代わりにパーサを使用してください。 –

+0

@Paulと@Justinの両方の示唆によって私は確信しています。正規表現はこの種の仕事にはあまり適していません。 提供されている例の解決策を提供しているので、@ Kobiの答えは正しいと思います。 – intellidiot

答えて

3

あなたは\n(?=<[\w/])を置き換えることができ</

でブレーク。これは、の位置に一致していて、<の前に表示されています。その後には、文字またはスラッシュが続きます。 (別のオプションは(?=<(?!%))です)。

これはあなたの投稿されたコードでは機能しますが、属性では<、サーバー側のスクリプトやJavaScriptブロックでは<というかなりのシナリオでは失敗します。より複雑なものが必要な場合は、erbパーサーのような強力なソリューションが必要になることがあります。

+0

+1あなたは私をこの1人で所有していました:) – Bohemian

1

これは%は、前または後のどちらか>whitespace<見つからないことを確実にする">\n<""(?<!%)>\s*<(?=!%))"を交換し、"\n</"

"(?<!(\s|^))</"を交換してください。 は、いつも私がコビの答えは優れていると思います:)