2014-10-21 3 views
-1

Я закодировал функцию AJAX, чтобы сделать поисковую систему в базе данных. Я хочу выделить желтые искомые символы в отображаемом результате.RegExp - Заменить некоторые символы между <td> markups

Следующий код работает довольно хорошо:

$.ajax({ 
    type: "GET", 
    url: "search_db.php", 
    data: "q="+valueSearch, 
    dataType: "JSON", 
    success: function(returnQuery) { 
     $("#table tbody").empty(); 
     // console.log(returnQuery); 
     $.each(returnQuery, function(i, line) { 
      content = '<tr>'; 
      content += '<td>' + line.name_serv + '</td>'; 
      content += '<td>' + line.name_dns + '</td>'; 
      content += '<td>' + line.ip + '</td>'; 
      content += '<td>' + line.pass1 + '</td>'; 
      content += '<td>' + line.pass2 + '</td>'; 
      content += '</tr>'; 

      re = new RegExp('('+valueSearch+')', "gi") 
      content2 = content.replace(re, '<span style="background-color: #ffff66;">$1</span>'); 

      $(content2).appendTo("#table tbody"); 
     }); 
    }, 
    error: function() { 
     $("#table tbody").empty(); 
    } 
}); 

Есть три случая, когда он не работает должным образом: если я ищу «д», «т» или 'г '(потому что замены сделаны в наклейках <td> или <tr>).

Вот пример переменной содержания:
"<tr><td>Jupiter</td><td>mail.test.com</td><td>10.0.0.1</td><td>root</td><td>a$01'deK</td></tr>"

Я пытаюсь сделать RegExp, чтобы добавить <span> разметку только символы, совпадающих поиску между <td> и </td>, но я не нахожу правильный синтаксис.

Есть ли у кого-нибудь идеи (чистый JavaScript и/или jQuery)?

+3

Правило 1: не используйте RegEx для анализа HTML. Правило 2: если вы все еще хотите анализировать HTML с помощью RegEx, см. Правило 1. [RegEx может соответствовать только обычным языкам, а HTML не является обычным языком] (http://stackoverflow.com/a/590789/930393) – freefaller

+0

Далее на комментарий @ freefaller и не делать этого с помощью регулярного выражения: вы уже используете jQuery, поэтому хорошим подходом было бы завершение 'content' и использование jQuery-функций для обработки этого:' $ (content) .find (....) 'и т. д. –

+0

Почему вы не соответствуете тексту при создании ячеек? – epascarello

ответ

1

Мой совет - запустить регулярное выражение ПЕРЕД Встраиванием e строк в td, и делать это на каждой линии индивидуально. Я хотел бы создать функцию внутри AJAX вызова, как это:

highlightMatches(line, valueSearch)) 
 
{ 
 

 
re = new RegExp('('+valueSearch+')', "gi") 
 
line2 = line.replace(re, '<span style="background-color: #ffff66;">$1</span>'); 
 

 
    return line2; 
 
} 
 

 

 

 
line.name_serv = highlightMatches(line.name_serv, valueSearch) 
 
line.name_dns = highlightMatches(line.name_dns, valueSearch) 
 
. 
 
. 
 
. 
 
.

тогда я обернуть каждую из строк в содержание так же, как вы сделали.

Это мой подход, по крайней мере.

+0

Я выбрал это решение, спасибо! Это был самый простой, и он отвечает на мою потребность. 'valueSearch' должен быть параметром функции, хотя (я вызывал функцию следующим образом:' highlightMatches (line.name_serv, valueSearch) '). – pihug12

+0

Спасибо! Мне было весело писать. Также спасибо за обновление, я отредактирую код, чтобы он соответствовал вашей функции. – Benshums

0

Вот упрощенный подход, чтобы выделить все вхождения t снаружи тегов:

content = content.replace(/<.*?>|(t)/gi, function(match, captured) { 
    if (!captured) 
    return match; 

    return '<span class="hl">' + captured + '</span>'; 
}); 

Вы можете легко обобщить этот подход, только не забудьте, чтобы избежать регулярных выражений метасимволов:

function highlightTextInHtml(content, search) { 
 
    // Escape regex metacharacters 
 
    search = search.replace(/[-\\()\[\]{}^$*+.?|]/g, '\\$&'); 
 
    
 
    // Build the regex 
 
    var re = new RegExp("<.*?>|(" +search+ ")", "gi"); 
 
    
 
    // Highlight matches 
 
    return content.replace(re, function(match, captured) { 
 
    if (!captured) 
 
     return match; 
 

 
    return '<span class="hl">' + captured + '</span>'; 
 
    }); 
 
} 
 

 
$(document).on("ready", function() { 
 
    var originalContent = $("#content").html(); 
 

 
    $("#search").on("keyup", function() { 
 
    $("#content").html(highlightTextInHtml(originalContent, $("#search").val())); 
 
    }).triggerHandler("keyup"); 
 
});
td { border: 1px solid black; } 
 
.hl { background-color: yellow; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div> 
 
    Search for: <input type="text" id="search" value="t"/> 
 
</div> 
 

 
<div id="content"> 
 
    <table> 
 
    <tr><td>Jupiter</td><td>mail.test.com</td><td>10.0.0.1</td><td>root</td><td>a$01'deK</td></tr> 
 
    </table> 
 
</div>

+0

Прошу прощения, я не пробовал ответить, потому что мне кажется, что мне легче для Бэнсумса. Большое спасибо за усилия, хотя! – pihug12

+0

Не беспокойтесь, его подход лучше в вашем случае. Я разместил это, чтобы ответить на вопрос * буквально *, он может быть полезен для людей, у которых есть строка HTML из внешнего источника, например. –

+0

Но вы все равно должны добавить 'valueSearch = valueSearch.replace (/ [- \\() \ [\] {}^$ * +.?|]/g, '\\ $ &'); 'к его решению, чтобы избежать метасимволов, особенно если' valueSearch' поступает из внешнего источника, такого как пользовательский ввод: попробуйте найти 'a $ 01'. –