Поиск в тексте
Мучаюсь уже несколько дней.
Нужно реализовать поиск слова в тексте, выделить и подсчитать найденные слова в тексте. Ко всему, нужно чтобы без перезагрузки страницы можно было ввести новое слово, старый поиск сброситься и будет выдан новый результат с учетом нового слова. Есть код поиска слова в тексте и выделения его цветом:
(function($) {
$.fn.highlight = function(words, settings) {
// default настройки
var highlight_settings = {
split: ' ',
className: 'highlight',
deafultpagetext : null,
caseSensitive: false
};
highlight_settings = $.extend(highlight_settings, settings);
function wordsHighlight(node, words) {
// Если поиск в тексте
if (node.nodeType == 3) {
var regexp = new RegExp("(" + words.replace(new RegExp(highlight_settings.split, 'g'), "|") +")",
(highlight_settings.caseSensitive ? "" : "i") + "g");
var str = $('<div></div>').text(node.data).html();
$(node).replaceWith(str.replace(regexp, '<span id="kwh" class="' + highlight_settings.className + '">$1</span>'));
// Если поиск в тегах
}
}
return this.each(function() {
wordsHighlight(this, words);
});
};
})(jQuery);
Далее вызываю из нужной мне страницы с текстом:
$(document).ready(function(){
$("#wordznalyze").click(function(){
$("#pagetext").highlight($("#kword").val());
});
});
<DIV class='words'>
<DIV class='col2'>
<DIV>Введите ключевое слово:</DIV>
<DIV><INPUT type='text' id='kword'></DIV>
</DIV>
<DIV class='col2'>
<DIV>Кол-во вхождений:</DIV>
<DIV id='wordcount'></DIV>
</DIV>
<DIV class='col3'><INPUT type='submit' id='wordsearch' value="Анализировать"></DIV>
</DIV>
Собственно, слова ищутся, но единожды (т.е. при вводе нового слова, в тексте остаются выделенными старые слова). Но главное, не знаю как подсчитать количество совпадений слова в тексте. |
Рекурсивно проходя по всем узлам DOM-дерева, собирайте все текстовые узлы (nodeType == 3) в массив, и ищите текст уже среди nodeValue этих узлов, постепенно в цикле складывая их в строку. Поиск регулярным выражением по HTML-коду тут беспомощен.
Для IE можно использовать метод range.findText, в остальных браузерах, кроме Opera, есть метод find, но он будет дергать страницу к каждому результату. |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Поиск символов</title>
</head>
<body style="font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px;">
<script type="text/javascript">
var stringCounter=0,saveOriginal=document.getElementById('searchText').innerHTML;
function textCounter() {
var mass=null,symbols="";stringCounter=0;
var symbolsearch=document.getElementById('searchText').innerHTML;
var string=prompt("Введите символ для поиска","");
var lastIndex="";
if(string=="undefined"||string==null||string=="") {
alert("Введён некорректный символ!!!");
}
else {
mass=symbolsearch.split(string);
for(var i=0;i<mass.length-1;i++) {
symbols+=mass[i];
symbols+="<span style='color:red;font-size:11px;font-weight:bold'>"+string+"</span>";
stringKeeper=string;
}
symbols+=mass[i];
document.getElementById('searchText').innerHTML=symbols;
for(var g=0;g<symbolsearch.length;g++) {
if(symbolsearch.substr(g,string.length)==string) {
stringCounter++;
}
document.getElementById('matches').innerHTML=stringCounter;
}
}
}
function clearElements() {
document.getElementById('searchText').innerHTML=saveOriginal;
}
</script>
<div id="searchText">Lorem ipsum — название классического текста-«рыбы». «Рыба» — слово из жаргона дизайнеров, обозначает условный, зачастую бессмысленный текст, вставляемый в макет страницы. Lorem ipsum представляет собой искажённый отрывок из философского трактата Цицерона «О пределах добра и зла», написанного в 45 году до нашей эры на латинском языке. Впервые этот текст был применен для набора шрифтовых образцов неизвестным печатником в XVI веке.
</div>
<p>Всего совпадений: <span id="matches"></span></p>
<a href="#" onclick="clearElements();textCounter();" style="font-family:Verdana, Arial, Helvetica, sans-serif; color:#0099FF;">Найти символ в тексте</a><br/><br/>
</body>
</html>
|
специально зарегился, чтобы сказать спасибо!всю ночь манался с этим поиском и подсветкой!
правда вот что то ничего нормально как обычно не запустилось. Chrome вообще русские символы не понимал, пока не убрал кодировку.Как убрал функцию clearElements(для чего она?) - всё заработало. Если кто знает, по какой причине так произошло ответьте) |
| Часовой пояс GMT +3, время: 03:06. |