4

私はこれを達成しようとしています:元のテキストにトーチされるべきではないhtmlタグが含まれている可能性があると仮定して、単語をタグにラップし、タグ内のスペース(複数の場合があります)

This is   <b>very bold</b> word. 

->に変換

<w>This</w><s> </s><w>is</w><s>   </s><b><w>very</w><s> </s><w>bold</w></b><s> </s><w>word</w>

それを達成するための正しい正規表現は何ですか?

4

2 に答える 2

1

2つの置換を使用する必要があります>>

s.replace(/([^\s<>]+)(?:(?=\s)|$)/g, '<w>$1</w>').replace(/(\s+)/g, '<s>$1</s>')

このデモを確認してください。


編集

より複雑な入力(以下のコメントに基づく)については、>>を使用してください

s.replace(/([^\s<>]+)(?![^<>]*>)(?:(?=[<\s])|$)/g, '<w>$1</w>').replace(/(\s+)(?![^<>]*>)/g, '<s>$1</s>');

このデモを確認してください。

于 2012-10-06T13:25:25.623 に答える
0

正規表現はすべてのタスクに適しているわけではありません。文字列に任意のHTMLを含めることができる場合、HTMLは文脈自由言語であり、正規表現はそれらのサブセットのみをカバーするため、正規表現を使用してすべてのケースを処理することはできません。ループとこれを処理するための大量のコードをいじる前に、次のことを提案しましょう。

ブラウザ環境にいる場合、またはDOMライブラリにアクセスできる場合は、この文字列を一時的なDOM要素内に配置し、テキストノードで作業してから、文字列を読み戻すことができます。

これは、私が数か月間作成し、現在更新されているLinguigiというライブラリを使用した例です。

var element = document.createElement('div');
element.innerHTML = 'This is   <b>very bold</b> word.';

var ling = new Linguigi(element);

ling.eachWord(true, function(text) {
    return '<w>' + text + '</w>';
});

ling.eachToken(/ +/g, true, function(text) {
    return '<s>' + text + '</s>';
});

alert(element.innerHTML);

例: http: //prinzhorn.github.com/Linguigi/Stackoverflow 12758422ボタンを押す)

于 2012-10-06T09:55:15.800 に答える