2016-08-26 8 views
1

私の予想目標:jqueryがDOMの最後のエントリを返さないのはなぜですか?

私は正規表現を次のように覆われているDOM要素の非常に最後のノードを選択しようとしています:

/(\[{3})[A-Z]+(\]{3})(\[{3})([0-9]{1,3})(\.*)([0-9]*)(\]{3})/g; 

この正規表現は[[[WIDTHCHANGE]]][[[250]]]または[[[HEIGHTCHANGE]]][[[250]]]のような文字列をカバーします。したがって、3回の[]の3文字の文字列と、その間にあるテキストともう1つの3回[]との間の数字。

マイ構造:

私は多くのスパンの要素が含まれており、非常に最後のspan要素は、この[[[WIDTHCHANGE]]][[[250]]]が含まれている事業部の要素を持っています。

私の現在の状態:

そして今、私は上記の正規表現でカバーテキストが含まれているだけで、このspan要素を選択します。しかし、JQueryは特定の要素の親の親を選択します。以下は

は私のJS-検索-コード:

var regex = /(\[{3})[A-Z]+(\]{3})(\[{3})([0-9]{1,3})(\.*)([0-9]*)(\]{3})/g; 
var ElementsToChange_ = $("span").filter(function() { 
    return regex.test($(this).text()); 
}).last(); 

は、私が行方不明またはmissunderstandingいはありますか?

EDIT 1:ここでは

Fiddleリンクです!

+2

フィドルはありますか? –

+0

@AdnanUmer提供;) – Snickbrack

+0

問題は正規表現です。 'regex.test(" Links [[[WIDTHCHANGE]] [[[250]] ")')は 'true'と' false'を交互に与えます。 。しかし、テキストは同じままです。奇妙な行動 –

答えて

3

スパンを選択すると、すべてのスパンが得られます。スパンには一致するテキストが含まれているため、テキストがある別のスパンでネストされているだけです。

解決策はスパンに含まれるものに依存しますが、あなたの原因でスパンを含まないスパンを選択するだけで済みます。

$("span:not(:has(span))").filter(...) 

<span>xxxx<span>foo</span></span>のように内部に他の要素を持つことができるのであれば、やや難しいです。子ノードを削除してテキストを読み取る必要があります。

0

問題は正規表現です。周囲で定義されている正規表現/は、再利用すると2つの同じ事象に対して予期しない動作を示しています。

Strange Behavior of Regular Expressions

RegExpFiddle

コンストラクタを呼び出すことによって、正規表現を作成することを

  1. 使用インライン正規表現Fiddle

    var ElementsToChange_ = $("span").filter(function() { 
        return /(\[{3})[A-Z]+(\]{3})(\[{3})([0-9]{1,3})(\.*)([0-9]*)(\]{3})/g.test($(this).text()); 
    }).last(); 
    console.log(ElementsToChange_); 
    
  2. のための2つの回避策があるかもしれません

    var regex = RegExp("(\\[{3})[A-Z]+(\\]{3})(\\[{3})([0-9]{1,3})(\\.*)([0-9]*)(\\]{3})"); 
    var ElementsToChange_ = $("span").filter(function() { 
        return regex.test($(this).text()); 
    }).last(); 
    console.log(ElementsToChange_); 
    
+0

この問題は、 '/'を使った正規表現のリテラル構文とは関係ありません。あなたの 'RegExp'コンストラクタには含まれていない' g'修飾子が正規表現上にあります。リテラルから 'g'を削除してください。それはOPの問題の一部にすぎませんが、その問題を修正します。 –

関連する問題