1

検索されたテキストのすべての出現を強調表示するオートコンプリートコンポーネントに取り組んでいます。私がしていることは、入力テキストを単語ごとに分解し、それらの単語のすべての出現をにラップすることです

私のコードは次のようになります

inputText = 'marriott st';
text = "Marriott east side";
textSearch = inputText.split(' ');
for (var i in textSearch) {
  var regexSearch = new RegExp('(?!<\/?strong>)' + textSearch[i]), "i");
  var textReplaced = regexSearch.exec(text);
  text = text.replace(regexSearch, '< strong>' + textReplaced + '< /strong>');
}

たとえば、「マリオットイーストサイド」という結果が与えられたとします。

そして入力テキスト: "marriott st"

私は得る必要があります

  <strong>marriot< /strong > ea < strong >st < /strong > side

そして、私は得ています

  <<strong>st</strong>rong>marriot</<strong>st </strong>rong>ea<<strong>st</strong> rong>s</strong> side

htmlタグ内での発生を回避するために、正規表現を改善するにはどうすればよいですか?ありがとう

   /(?!<\/?strong>)st/
4

2 に答える 2

2

文字列を1回のパスで処理します。検索文字列から1つの正規表現を作成できます。

var search_pattern = '(' + inputText.replace(/\s+/g, '|') + ')';
// `search_pattern` is now `(marriot|st)`
text = text.replace(RegExp(search_pattern, 'gi'), '<strong>$1</strong>');

デモ

最初に検索文字列を分割し、単語を長さで並べ替えて結合し、より長い一致に高い優先順位を与えることもできます。

文字列内の特殊文字をエスケープする必要があります:javascriptを使用して正規表現の特殊文字をエスケープするにはどうすればよいですか?

于 2013-01-02T15:12:34.487 に答える
0

各検索の前に、毎回機能する元の検索文字列を取得(または保存)することをお勧めします。たとえば、現在のケースでは、すべての「<strong>」タグと「</strong>」タグを「」に置き換えることができます。これにより、特に将来的に他のhtmlタグやフォーマットを追加する場合に、正規表現をシンプルに保つことができます。

于 2013-01-02T15:03:00.500 に答える