2011-02-25 10 views
2

に1つのタグタイプを持つ文字列を置換するための正規表現私はspanタグ(他のHTMLタグ、単純なテキスト)と文字列であってもよい<span style="[^"]+">.*?</span>タグの前と後、間のすべての文字列を置換するに 私はこのような正規表現を持つ。 .+?.*?、代わりにを:Javascriptを

'<span>foo</span><span style="text-decoration:underline;">bar</span><span>baz</span>' 

私も使ってみてください。この文字列

'foo<span style="text-decoration:underline;">bar</span>baz' 

ため

var span_re = /^(.+)(?=<span)|(?=<\/span>)(.+)(?=<span)|(?=<\/span>)(.+)$/g; 
str = str.replace(span_re, '<span>$1</span>'); 

は、私はこれが欲しい

'<span>foo</span><span style="text-decoration:underline;">bar<span></span>' 

を得ましたは結果のない完全な式をキャプチャします。

私はパーサーは必要ありません。私はXHTMLを解析せず、自己完結型のタグを持っていません。

+0

可能重複(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except -xhtml-self-contained-tags)...( –

+1

私はXHTMLを解析したくありません私は1つのタグタイプ(スパン)とテキストの前、後、後の間に - この単純な置換のためのパーサとして複雑なものを使用するのはなぜですか?パーサーに対して〜1kの代わりに〜1kのコードを使用してください。 – jcubic

+0

@MattBallはい、パーサーを使用する必要があります。そうであるようにしてください:[必須リンク](http://stackoverflow.com/q/4231382/471272) – tchrist

答えて

1

解析HTMLは、ほとんどのWebブラウザのコンテキストで良いアイデア、特殊ではありません。ここではjQueryを使用して、あなたが望むものを取得する簡単な例です:

そのHTMLがDOMの内側になっていない場合でも、ダミー要素でラップするのは簡単です:ボーナスとして

var wrapper = $('<div />') 
wrapper.html('foo<span style="text-decoration:underline;">bar</span>baz'); 
wrapper.contents() 
    .filter(
     function(){return this.nodeType == 3;} //select text nodes only 
    ) 
    .wrap('<span />'); 

他のタグでもうまく動作し、フリーテキストのとの間に<span>タグが複数ある場合でも、それらはの間にあります。

実施例:[XHTMLの自己完結型のタグを除いて正規表現一致オープンタグ]のhttp://jsbin.com/acigu5/

+0

答えてくれてありがとうございますが、私は既にこのスパンタグの解決策を見つけました。この '[[uib; color; background] text]'のような文字列を、スタイル)を使用する代わりに最初に私は文字列を分割し、テックス文字列の書式設定の間にタグを一致させる必要はありません。 – jcubic

1

あなたはそれを複雑にしているかもしれません。

s = s.replace(/^[^<]+|[^>]+$/gi, '<span>$&</span>'); 

この正規表現は(ない<、最初から)タグの前にテキストを検索しますか:あなたは、単一の<span>、ない他のタグなしエスケープ>兆候を有していてもよくわかっている場合は、この単純な正規表現を使用することができますタグの後(>ではなく、最後まで)、<span>でラップします。 $& JavaScript regex replaceは、マッチ全体またはグループ0(他のフレーバーの場合は\0または$0)を表します。

元の正規表現の(?=<\/span>)は先読みで、ルック・バックではありません(JavaScriptには裏返しがありません)。その結果、(.+)が終了タグと一致し、それを消費し、無効なHTMLが発生しました。例の作業

:正規表現を使用してhttp://jsbin.com/acexu4/

+0

ありがとうございますが、1つのタグはありませんが、タグの種類は1つではありません。そのため、タグはネストされていない可能性があります。 – jcubic