2012-01-16 14 views
1

ずにspanタグの開始と終了と一致するようにREGEX私は、文字列に置き換えを行うには、次の正規表現を使用しています:この正規表現は欠陥を持っているは彼らの内部テキスト

<\/?(span)\b(?:\s+class="highlight")?> 

しかし...このサンプルコードを取ります例:

class = "highlight"を設定した場合のみ、正規表現は両方のspanタグに一致します。 RegExを使用してこれをどのように達成できますか?

PS:これは、RegExを使ってはいけないと言ってください。なぜなら、私はあなたの答えを話題にならないように格下げするからです。これはRegExの人のための質問です。

EDIT:上記の正規表現は、「で、ここでいくつかのテキストを置換するコードはJavaScriptである(MooToolsは)

var regex = new RegExp("(<span[^>]+class\\s*=\\s*(\"|')highlight\\2[^>]*>)(.*?)(</span>)",'g'); 
var replaced = element.get('html').replace(regex, "$3"); 
element.set('html', replaced); 

:私は置き換える NOTEを行うには、次の正規表現を使用しています下の受け入れ答えに基づいて、いくつかのテキストをここに入力してください」(二重引用符は含まれません)

+10

HTMLを扱うためにregexを使用していません。そして、あなたは人々にあなたにこれを教えてはいけないと言っておらず、答えを落とすよう脅しています。 – Tomalak

+4

私は正規表現を使用するべきではないことを私に教えてくれる答えは望んでいません。質問する前にstackoverflowを閲覧しました。何らかの賢い人が来る前にSTATEを実行してください。何らかの形でコミュニティを助けてくれない「htmlを解析するためにREGEXを使用しない」のようなものに答えます。あなたが正規表現で答えを持っていなければ、私はあなたの解決策に興味がありません。あなたがそうするなら、私は投票し、あなたの答えを受け入れます。 – user253530

+0

申し訳ありませんが、私は同意しません。 1つは、私はあなたがこのコミュニティコミュニティを助けるためにこの質問をしたとは思っていないので、これは議論でもありません。次に、正規表現はあなたの問題のための正しいツールではなく、明らかにあなたはそれを知っています。この事実は変わりません。あなたがそのような質問をするつもりなら、人々があなたにこれを伝えるという事実に対処しなければならないでしょう。それは、人々が本質的に欠陥のあるHTML問題の解決法を提案するのを止めれば、「コミュニティ」を助けるでしょう。 – Tomalak

答えて

5

これは与えるべきです最も柔軟性があります。

(<span[^>]+class\s*=\s*("|')highlight\2[^>]*>)[^<]*(</span>) 

UPDATE:

あなたは、開始タグと終了タグのために必要なキャプチャグループは、\ 1と\ 3です。

+0

質問のタイトルを読むと、@ user253530はスパンタグ、開始タグと終了タグだけです。 –

+0

括弧を削除するだけで済みます。それ以外の場合は、末尾のタグに一致させて内容を完全に無視できますか?先読みはキャプチャされません。私が知っているのは –

+0

です。しかし、@ user253530自身の正規表現に基づいて、私たちは開始タグと終了タグだけに興味があります。 –

0

class=highlightの部分は、それをキャプチャするグループの前に?を置くことによって明らかです。

これはあなたのためにそれを行う必要があります。

var regex = /(?:<span\s+[^>]*?\s*class\s*=\s*('|")(?:\S+\s+)?highlight(?:\s+\S+)?\1[^>]*>|<\/span>/; 

これもa b c highlight e f gのようなクラス属性とSPANタグが含まれます。

あなたはその 一致終了とSPANタグをキャプチャする場合は、あなたがこれを使用することができます。また

、およびアクセスグループ1と開口部のために、それぞれ3と終了タグ:

var regex = /(<span\s+[^>]*?\s*class\s*=\s*('|")(?:\S+\s+)?highlight(?:\s+\S+)?\1[^>]*>).*?(<\/span>)/; 
+1

'(?:xyz)'の '?:'は、オプションのグループを指定しません。 – Tomalak

+0

?私が望むものではない普通のスパンだけに一致します... – user253530

+0

もちろんです。 '(?:\ s + class =" highlight ")?' * end *の疑問符はそれを行います。 –

2

ただ、代替ソリューションは、正規表現を使用するよりももより良い可能ボットだけではないことを示すために:

$$('span.highlight').each(function (node, idx, Elem) { 
    var txt = document.createTextNode(Elem.get('text')); 
    node.parentNode.replaceChild(txt, node) 
}); 

このフィドルを参照してください:http://jsfiddle.net/Tomalak/umgZp/

を(そして、これは単なる上からです私の帽子には、今までMooToolsには全く触れていませんでした。これよりもエレガントな方法があります。)

+0

私はそれをすることはできません、私は助けていただければ幸いですが、これは不可能です。私はjsでハイライトを実装しています。テキストは変更されずに来て、ユーザーは単語の束を入力し、クラスはDOMでそれらを探します。テキスト内に追加されたスパンを除いて、他には何も変更する必要はありません。追加されたハイライトを削除するには、この正規表現が必要でした。私は今、あなたが正規表現よりもこれを行うためのよりよい解決策ではないと断言してくれることを願っています。可能な限り最も速い方法です...ユーザーが何を必要としているのか、DOMがロードされるまでどのように見えるのか分かりません。 – user253530

+0

あなたは何を探すべきかわからないときに、正規表現でHTMLを解析してはいけないと言う人がいるのは唯一の理由ですが、私は知っています。私はそれを置いたので、私は何を探しているのか正確に知っています。 – user253530

+0

いいえ。人々がHTMLを解析するために正規表現を使用してはならないと言う理由は、正規表現がHTMLのネストされた変数構造を処理できないためです。また、この4ライナーは、あなたがやりたいことを*厳密に*行います。強調表示の範囲を削除します。私は真剣にあなたがそれを使用することができないと言ったときにそれを取得しない、このステートメントはまったく意味がありません。 – Tomalak