문자열 내에서 (배열에서) 하위 문자열을 찾고 하위 문자열과 동일한 제목을 가진 드롭 다운 상자로 바꿉니다.JQuery : 문자열 내의 부분 문자열의 여러 인스턴스를 오류없이 html로 바꾸십시오.
문자열은 사용자 입력에서 왔으며 하위 문자열은 작업 코드에서 데이터베이스에서 가져온 것입니다.
는이 질문에 DavidTonarini에 의해 주어진 대답에서 일한 : Javascript: replace() all but only outside html tags
그러나 이것은 단지 '<'과 '<'사이에 포함되는 텍스트를 제외합니다.
입력 한 경우 : '레벨을 한 레벨'로 포함 시키면 '레벨'이 드롭 다운 상자로 반환되지만 '레벨'이 일반 텍스트로 반환됩니다. 배열의 항목과 일치해야하고 드롭 다운 상자로 대체됩니다. 사용자 입력 내에서 동일한 문자열을 반복 할 때도 문제가 발생합니다. 사용자 입력 내에서 동일한 하위 문자열을 여러 번 일치시키는 기능이 필요합니다. ,
var regEx = new RegExp("(" + searchWord + ")(?!([^<]+)?>)", "gi")
문제, 당신은 이미 자신을 발견하는 것 같이
var data = {
"a_levels": {
"a_level": {
id: 1,
units: 2,
created: "2016-10-04 19:00:05",
updated: "2016-10-05 09:37:46"
},
"a_levels": {
id: 2,
units: 2,
created: "2016-10-05 08:19:27",
updated: "2016-10-05 09:37:39"
}
},
"a_level": {
"a_level": {
id: 1,
units: 2,
created: "2016-10-04 19:00:05",
updated: "2016-10-05 09:37:46"
},
"a_levels": {
id: 2,
units: 2,
created: "2016-10-05 08:19:27",
updated: "2016-10-05 09:37:39"
}
}
};
var input, // Create empty variables.
response;
$('#submit').click(function() {
input = $('#userInput').val();
response = input;
// CREATE DROPDOWN BOXES.
var strings_used = [];
$.each(data, function(i, v) { // Iterate over first level of output.
for (var itr = 0; itr < strings_used.length; ++itr) {
if (strings_used[itr].indexOf(i) !== -1) {
return true;
}
}
var searchWord = i.replace(/_/g, " "); // Replace underscores in matches with blank spaces.
var regEx = new RegExp("(" + searchWord + ")(?!([^<]+)?>)", "gi"); // Create regular expression which searches only for matches found outside html tags.
var tmp = response.replace(regEx, "<span class='btn-group'><button class='btn btn-primary dropdown-toggle' type='button' data-toggle='dropdown'>" + searchWord + "<span class='caret'></span></button><ul class='" + i + " dropdown-menu'></ul></span>"); // Replace matching substrings with dropdown boxes.
if (tmp !== response) { // Check if replacement is complete.
response = tmp; // Update response.
strings_used.push(i);
}
});
$('#template').empty().append(response); // Populate template container with completed question response including dropdown boxes.
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div id="searchbox">
<div class="input-group">
<input id="userInput" type="text" class="form-control" placeholder="type here...">
<span id="submit" class="input-group-btn">
\t \t \t <button class="btn btn-default" type="submit">GO!</button>
\t \t \t </span>
</div>
</div>
<div class="row">
<div id="template" class="col-sm-10 col-md-offset-1 text-left"></div>
</div>
</body>
감사합니다 아래에 설명하고있는 바와 같이, 여기에 훨씬 짧은, 간단하고 버그가없는 구현 가능한 스케치입니다 에스. 나는 인터넷에 대한 접근이 제한적 이었지만, 이것이 정확하다는 것을 보았다. 잠시 후 곧 업데이트됩니다. 더 많은 정규 표현식을 연습 할 필요가 있습니다. –
Woah woah woah, 잠시만 기다려주세요. 패치 된 버전의 코드를 사용하고 복잡한 요구 사항을 수정하기보다는 코드를 리팩터링하는 것이 좋습니다. 올바른 트랙을 찾으려면 다음과 같은 간단한 스케치가 필요합니다. https://jsfiddle.net/huwwefa0/15/ –
여기에 더 필요한 버전이 있습니다 .... 깔끔하게 작성된 코드를 변경하는 것이 훨씬 쉽습니다.) https://jsfiddle.net/huwwefa0/16/ –