0

replaceTextプラグインを使用してページ上のすべての単語 (および余分なスペース/句読点) を span タグでラップするブックマークレットに取り組んでいます。このプラグインは、ページ上のすべてのテキスト ノードをトラバースし、ページ上の他の HTML フォーマットを壊すことなく、関数を呼び出して各ノードのコンテンツを操作できるようにします。(これはどれも問題ではありません。私はかなり確信していますが、コンテキストが役立つかもしれないと感じました)。参考までに、関数の呼び出しは次のようになります。

$("body *").replaceText(/\S+\s*/g, spanWrap);

問題は、私の目的のためにこれらの単語を区切るために見つけた最良の正規表現 -- /\S+\s*/g-- には、ブロック コメントの終わりの文字 ("*/") が含まれていることです。Notepad++ の .js ファイルの数行前にブロック コメントの開始を追加すると、シンタックス ハイライターがそれをそのように読み取っていることがわかります。

ブックマークレットを実行すると、ほとんどのサイトでこの問題は発生せず、ブックマークレットは意図したとおりに機能します。ただし、一部のサイトでは、予測できない理由により、" Uncaught SyntaxError: Unexpected token <" エラーが発生し、ブックマークレットが中断または実行を停止します。関数で使用している正規表現をreplaceText、ブックマークレットの以前のバージョンで使用していた正規表現に変更する/\b(\S+?)\b/gと、ブックマークレットで他に何も変更しない場合、これらのサイトはエラーを発生させなくなり、ブックマークレットはそのまま動作します結構なので、それを引き起こしているのはブロックコメントクロージャーの存在だと信じなければなりません。

ただし、私がブックマークレットでやろうとしていることの目的のために、そのコメントクロージャーを含む式は、/\S+\s*/g句読点と空白をキャッチしない他のものよりもはるかにうまく機能します。ただし、特定のサイトでブックマークレットが壊れないことも本当にありがたいです。

それで、私が持っている正規表現を修正してコメントとして読み取られないようにする方法はありますか、それともおそらく別の構文などで同じ仕事をすることができる方法を提案できますか? (私の質問から明らかでない場合、私は正規表現がどのように機能するかについてほとんど理解しておらず、この例で使用しているものを他のスタックオーバーフローの質問/回答からコピーして取得しました)

4

2 に答える 2

2

長いバージョンを使用してください:

var regex = new RegExp("\\S+\\s*", "g");
$("body *").replaceText(regex, spanWrap);

(編集:文字列内のバックスラッシュをエスケープしました)

于 2013-02-18T14:52:40.727 に答える
0

それで、コメントとして読まれないように私が持っている正規表現を修正する方法はありますか?

私は正気なことは何も考えられません。RegExp(コンストラクターを使用して正規表現を2つの文字列に分割し、それらを連結して正規表現にすることで効果を得ることができます。ただし、それは正気とは言えません。)

//ブロックコメントの代わりに一連の行コメントを使用します。

于 2013-02-18T14:50:13.503 に答える