簡體   English   中英

如何匹配並返回字符串的多個實例,其中單個撇號可以包含在任何索引中?

[英]How can I match and return multiple instances of a string, where single apostrophes could be contained at any index?

請注意,'C#'標簽是故意包含的,因為我可以在這里接受C#語法,因為我可以選擇在客戶端和服務器端執行此操作。 閱讀下面的“你可能想知道的事情”部分。 此外,還包含了“正則表達式”標記,因為使用正則表達式很可能是解決此問題的最佳方法。

我在這里找到了以下突出插件:

http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html

這是該插件中的代碼:

/*

highlight v4

Highlights arbitrary terms.

<http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html>

MIT license.

Johann Burkard
<http://johannburkard.de>
<mailto:jb@eaio.com>

*/

jQuery.fn.highlight = function(pat) {
 function innerHighlight(node, pat) {
  var skip = 0;
  if (node.nodeType == 3) {
   var pos = node.data.toUpperCase().indexOf(pat);
   if (pos >= 0) {
    var spannode = document.createElement('span');
    spannode.className = 'highlight';
    var middlebit = node.splitText(pos);
    var endbit = middlebit.splitText(pat.length);
    var middleclone = middlebit.cloneNode(true);
    spannode.appendChild(middleclone);
    middlebit.parentNode.replaceChild(spannode, middlebit);
    skip = 1;
   }
  }
  else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
   for (var i = 0; i < node.childNodes.length; ++i) {
    i += innerHighlight(node.childNodes[i], pat);
   }
  }
  return skip;
 }
 return this.length && pat && pat.length ? this.each(function() {
  innerHighlight(this, pat.toUpperCase());
 }) : this;
};

jQuery.fn.removeHighlight = function() {
 return this.find("span.highlight").each(function() {
  this.parentNode.firstChild.nodeName;
  with (this.parentNode) {
   replaceChild(this.firstChild, this);
   normalize();
  }
 }).end();
};

這個插件非常容易。

如果我想在以下元素中突出顯示“Farm”一詞的所有實例......(續)

<div id="#myDiv">Farmers farm at Farmer's Market</div>

...(續)我需要做的就是使用:

$("#myDiv").highlight("farm");

然后它將突出顯示“Farmers”和“Farmer's”中的前四個字符,以及div#myDiv的整個單詞“farm” div#myDiv

沒問題,但我想用它:

$("#myDiv").highlight("Farmers");

並強調“農民”和“農民”。 當然,問題是我在運行時不知道搜索術語(本例中的術語“農民”)的價值。 所以我需要在字符串的每個索引處檢測不超過一個撇號的所有可能性。 例如,如果我調用$("#myDiv").highlight("Farmers"); 就像我上面的代碼示例一樣,我還需要突出顯示原始字符串的每個實例,另外:

  • “農民
  • F'armers
  • Fa'rmers
  • Far'mers
  • Farm'ers
  • Farme'rs
  • 農民
  • 農民

當然,不應突出顯示兩個或更多撇號的實例,例如“Fa''rmers”。

我想如果我可以包括(突出顯示)像“Fa'rmer's”這樣的詞語會很好,但是我不會推動我的運氣,而且我會做得很好,只是為了獲得上面我的項目符號列表中的匹配項,根本只有一個撇號出現在字符串中。

我考慮過正則表達式,但我不太清楚語法,更不用說我不認為我可以用真/假的返回值做任何事情。

反正有沒有完成我需要的東西?

你可能想知道的事情:

  1. 高亮插件負責處理我需要的所有不區分大小寫的要求,因此根本不需要擔心。
  2. JavaScript,jQuery甚至C#中提供的語法都是可以接受的,考慮到隱藏的輸入字段,我使用來自客戶端的值,使用我的C#代碼填充服務器端。
  3. 填充隱藏輸入字段的C#代碼使用Razor(即,我在C#.Net Web-Pages w / WebMatrix環境中。但是,這段代碼非常簡單,如下所示:

    for (var n = 0; n < searchTermsArray.Length; n++)

    {

     <input class="highlightTerm" type="hidden" value="@searchTermsArray[n]" /> 

    }

我正在復制你之前提出的問題的答案。

我想在閱讀了其他答案的評論后,我已經弄明白你的目的是什么。 您不需要一個可以為任何可能的輸入執行此操作的單一正則表達式,您已經輸入,並且您需要構建一個匹配它及其變體的正則表達式。 你需要做的就是這個。 要清楚,由於您在問題中誤解了,以下語法實際上是在JavaScript中。

var re = new RegExp("'?" + "farmers".split("").join("'?") + "'?", "i")

這樣做是取你的輸入字符串, "farmers"並將其分成單個字符列表。

"farmers".split("") == [ 'f', 'a', 'r', 'm', 'e', 'r', 's' ]

然后用"'?"將字符再次拼接在一起"'?" 它們之間。 在正則表達式中,這意味着'字符將是可選的。 我將相同的粒子添加到表達式的開頭和結尾,以匹配字符串的開頭和結尾。

這將創建一個與您描述的方式匹配的正則表達式,前提是它也可以匹配原始字符串。

在這種情況下,上面的行構建了這個正則表達式:

/'?f'?a'?r'?m'?e'?r'?s'?/

編輯

看了一下這個,以及你正在使用的功能,我認為你最好的選擇是修改高亮功能,使用正則表達式而不是直接替換字符串。 我認為它甚至難以處理。 這是一個完全未經測試的刺。

function innerHighlight(node, pat) {
    var skip = 0;
    if (node.nodeType == 3) {
        var matchResult = pat.exec(node.data);  // exec the regex instead of toUpperCase-ing the string
        var pos = matchResult !== null ? matchResult.index : -1;  // index is the location of where the matching text is found
        if (pos >= 0) {
            var spannode = document.createElement('span');
            spannode.className = 'highlight';
            var middlebit = node.splitText(pos);
            var endbit = middlebit.splitText(matchResult[0].length);  // matchResult[0] is the last matching characters.
            var middleclone = middlebit.cloneNode(true);
            spannode.appendChild(middleclone);
            middlebit.parentNode.replaceChild(spannode, middlebit);
            skip = 1;
        }
    }
    else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
        for (var i = 0; i < node.childNodes.length; ++i) {
            i += innerHighlight(node.childNodes[i], pat);
        }
    }
    return skip;
 }

我在這里嘗試做的是保留現有邏輯,但使用我構建的正則表達式來查找和拆分字符串。 請注意,我不再執行toUpper調用了,但是我已經使正則表達式不區分大小寫了。 如上所述,我根本沒有對此進行測試,但似乎它應該非常接近工作解決方案。 無論如何足夠讓你入門。

請注意 ,這不會為您提供隱藏的字段。 我不確定你需要的是什么,但這會(如果它是正確的)照顧突出顯示字符串。

暫無
暫無

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

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