簡體   English   中英

如何使用JavaScript在HTML中標記一些文本,這些文本跨越多個標簽?

[英]How can I markup some text spanning multiple tags in HTML using Javascript?

我想使用正則表達式來標記一些文本,這些文本可能跨越HTML中的任意數量的標簽。

例如 給定正則表達式"brown\\ fox.*lazy\\ dog"

<div>The quick brown <a href="fox.html">fox</a></div>
<div>jumps over</div>
<div>the lazy <a href="dog.html">dog</a></div>

將被轉換為

<div>The quick <strong>brown </strong><a href="fox.html"><strong>fox</strong></a></div>
<div><strong>jumps over</strong></div>
<div><strong>the lazy </strong><a href="dog.html"><strong>dog</strong></a></div>

在關閉標記之間使用一個空的<strong>元素也可以。 使用任何Javascript庫都可以。 它可以是特定於瀏覽器的。

我將分兩步進行操作,首先是定位整個句子,其次是將每個單詞都置於strong

而且由於我發現手動構建正則表達式不可行,因此生成了它們:

var sentence = 'the quick brown fox jumps over the lazy dog';
var r1 = new RegExp(sentence.split(' ').join('\\s*(<[^>]*>\\s*)*'), 'i');
var r2 = new RegExp('('+sentence.split(' ').join('|')+')', 'gi');
str = str.replace(r1, function(sentence) {
  return sentence.replace(r2, '<strong>$1</strong>')
});

示范

我不保證它在所有情況下都有效,但是我現在看不到任何失敗的情況。 這段代碼可確保句子完整,不包含標簽外的單詞,並且單詞順序正確。

我希望有人能提出一個更簡單的解決方案。 這是我想出的。 http://jsbin.com/usapej/4

// Initial values
var html = $('#text').html();
var re = /brown fox(.|[\r\n])*lazy dog/;
var openTag = "<strong>";
var closeTag = "</strong>";

// build a list of tags in the HTML
var tagRe = /<[^>]*>/g;
var matches = [];
var tagResult;
var offset = 0;
while((tagResult = tagRe.exec(html)) !== null) {
  // Make the index relative to the start of the string w/o the tags
  tagResult.index -= offset;
  offset += tagResult[0].length;
  matches.push(tagResult);
}

// put our markup in the HTML
var text = $('#text').text();
var result = re.exec(text);
text = text.substring(0, result.index) + openTag + result[0] + closeTag + text.substring(result.index + result[0].length);

// Put the original tags back in surrounded by our close and open tags if it's inside our match
offset = 0;
var p;
for(var i = 0; i < matches.length; i++) {
  var m = matches[i];
  if(m.index <= result.index) {
    text = text.substring(0, m.index + offset) + m[0] + text.substring(m.index + offset);
    offset += m[0].length;
  } else if(m.index > result.index + result[0].length) {
    p = m.index + offset + openTag.length + closeTag.length;
    text = text.substring(0, p) + m[0] + text.substring(p);
    offset += m[0].length;
  } else {
    p = m.index + offset + openTag.length;
    var t = closeTag + m[0] + openTag;
    text = text.substring(0, p) + t + text.substring(p);
    offset += t.length;
  }
}

// put the HTML back into the document
$('#text').html(text);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM