2015-02-04 5 views
1
filter('highlight', function() { 
return function(data, search) { 
    if (data) { 
     data = data.toString(); 
     if (search) { 
      for(var i = 0; i < search.length; i++) { 
       data = data.replace(new RegExp("(" + preg_quote(search[i]) + ")" , 'gi'), "<span class='search-highlight'>$1</span>"); 
      } 
     } 
    } 
    return data; 
};}). 

мне нужно выделить данные, если оно содержит какой-либо элемент поиска. если данные «[email protected]» и поиск содержит «foo», функция вернет <span ..>foo</span>@bar.com.Регулярное выражение для строки, которая не начинается и заканчивается последовательностью

Проблема в том, что массив поиска содержит «foo», «a», функция возвращает <sp<span ..>a</span>n ..>foo</span>@bar.com, что нарушает вид страницы.

Идея - мне нужно пропустить что-нибудь, что уже окружено тегом <span></span>. Как я могу это сделать?

+2

Вместо того, чтобы изменять строку 'data' на месте и последовательно добавлять отмеченные значения, можете ли вы построить финальную строку в другом объекте и объединить все вместе в конце? Таким образом, вы можете избежать сопоставления изменений, которые вы заменили. –

+0

Это полезная мысль! Можете ли вы помочь, как я могу это сделать ...? – fatCop

+1

Зачем готовить всю еду самостоятельно? Иногда отправляйтесь в рестораны. http://www.the-art-of-web.com/javascript/search-highlight/ –

ответ

0

Это классический пример того, почему вы не смешиваете HTML и Regex.

У вас есть DOM, используйте его!

Во-первых, используйте регулярное выражение, чтобы найти положение матча. Это можно сделать, позвонив по номеру regex.exec(string) и затем получив regex.lastIndex. Это говорит вам, где регулярное выражение выполнило поиск. Вызовите textNode.splitText(), используя это lastIndex, а затем минус длину матча. Это отделит согласованный текст от остальных. Затем вы можете обернуть это внутри элемента.

Повторите все текстовые узлы и все поисковые запросы.

Я оставлю для вас точный код, как упражнение, но это будет много, МНОГО более надежным.

+0

спасибо за ваше ценное предложение! но будет ли этот процесс работать, если мои ** данные ** являются «[email protected] foo» и ** search ** terms являются «foo», «bar»? Пожалуйста, дайте мне знать подробности :( – fatCop

+0

Можете ли вы дать мне точное решение? @Niet – fatCop

+0

Потому что мне скучно: http://jsfiddle.net/hn2bpz0y/ Попробуйте и поймите, как это работает;) –

Смежные вопросы

 Смежные вопросы