У меня есть строка, например, эта строка:
bigString = "<div dir=\"rtl\" style=\"text-align: right\"><ul><li><span>רשאי, רק כאשר הרכב העוקף הוא רכב משא.</span></li><li><span>רשאי, רק בדרך שאינה עירונית.</span></li><li><span id=\"correctAnswer1759\">רשאי.</span></li><li><span>רשאי, אם באוטובוס אין נוסעים.</span></li></ul><div style=\"padding-top: 4px;\"><span><button type=\"button\" onclick=\"var correctAnswer=document.getElementById('correctAnswer1759');correctAnswer.style.background='yellow'\">הצג תשובה נכונה</button></span><br/><span style=\"float: left;\">| «D» | </span></div></div>"
Я хочу получить каждую из этих строк.
Для этого я решил сохранить в массиве первую строку между <li><span>HERE</span></li>
а затем удалите теги, которые покрывали его из большой строки, и сделайте это 3 раза, пока каждая из этих строк не окажется в массиве.
Я мог бы сделать это на Java, но с Java есть другая проблема, поэтому я решил сделать это на JavaScript.
В Java я мог бы использовать эту функцию для получения первой строки:
arr[j] = StringUtils.substringBetween(bigString,"<li><span>","</span></li>");
А затем замените первые теги <li><span> </span></li>
на эти функции:
bigString = bigString.replaceFirst("<li><span>","<null>");
bigString = bigString.replaceFirst("</span></li>","<null>");
Теперь я не могу найти подходящие функции для замены Java.
var bigString = data.records[0].description4;
var end = "</span></li>";
var start = "<li><span>";
var strings = []; bigString.split(end).forEach(s => {index = s.indexOf(start);
if (index >= 0) {strings.push(s.substring(index + 3)); }});
for(var i = 0; i < 3; i++){
console.info(strings[i]);
}
Результат: https://prnt.sc/w1wugv
Мне нужен результат: רשאי, רק כאשר הרכב העוקף הוא רכב משא. רשאי, רק בדרך שאינה עירונית. רשאי, אם באוטובוס אין נוסעים.
🤔 А знаете ли вы, что...
С JavaScript можно создавать расширения для различных платформ, таких как Adobe Acrobat и Microsoft Office.
Это определенно не самый чистый, но я бы предложил такое решение для извлечения всех строк в массив:
function getMiddleStrings(bigString, begin, end) {
strings = [];
bigString.split(end).forEach(s => {
index = s.indexOf(begin);
if (index >= 0) {
strings.push(s.substring(index + begin.length));
}
});
return strings;
}
Тогда массив strings
содержит все подстроки.
Вызывая getMiddleStrings(bigString, "<li><span>", "</span></li>")
, вы в основном разделяете строку на каждый тег </span></li>
, а затем удаляете все, что было до, включая все теги <li><span>
.
Этот код заключает нужные элементы в уникальную строку. Затем он разбивает текст на эту уникальную строку и, если присутствуют необходимые теги, берет текстовое содержимое.
var bigString = '<div dir = "rtl" style = "text-align: right"><ul><li><span>רשאי, רק כאשר הרכב העוקף הוא רכב משא.</span></li><li><span>רשאי, רק בדרך שאינה עירונית.</span></li><li><span id = "correctAnswer1759">רשאי.</span></li><li><span>רשאי, אם באוטובוס אין נוסעים.</span></li></ul><div style = "padding-top: 4px;"><span><button type = "button" onclick = "var correctAnswer=document.getElementById("correctAnswer1759");correctAnswer.style.background = "yellow"">הצג תשובה נכונה</button></span><br/><span style = "float: left;">| «D» | </span></div></div>';
var res = [];
var splStr = bigString.replace(/<li><span>/gi, ',,#*&,,<li><span>')
.replace(/</span></li>/gi, '</span></li>,,#*&,,')
.split(",,#*&,,");
for (let i = 0; i < splStr.length; i++) {
if (splStr[i].indexOf('<li><span>') > -1 && splStr[i].indexOf('</span></li>') > -1) {
res.push(splStr[i].replace(/</?[^>]+(>|$)/g, ""));
}
}
console.info(res);
Вы можете использовать регулярное выражение для получения результата -
var bigString = '<div dir = "rtl" style = "text-align: right"><ul><li><span>רשאי, רק כאשר הרכב העוקף הוא רכב משא.</span></li><li><span>רשאי, רק בדרך שאינה עירונית.</span></li><li><span id = "correctAnswer1759">רשאי.</span></li><li><span>רשאי, אם באוטובוס אין נוסעים.</span></li></ul><div style = "padding-top: 4px;"><span><button type = "button" onclick = "var correctAnswer=document.getElementById("correctAnswer1759");correctAnswer.style.background = "yellow"">הצג תשובה נכונה</button></span><br/><span style = "float: left;">| «D» | </span></div></div>';
var matches = bigString.matchAll(new RegExp(/<li><span>(.*?)</span></li>/g));
var groups = Array.from(matches);
var result = groups.map((m) => m[1]);
console.info(result);
У меня есть для вас решение, написанное на C#, но я уверен, что вы можете перевести его на JS, потому что оно не использует какие-либо специфичные для C# методы.
Взгляните на мой код:
int openTagStart = fulltext.IndexOf("<", pos);
int openTagEnd = fulltext.IndexOf(">", pos);
int closedTagStart;
int closedTagEnd;
int textStartPos;
string textInTags;
tag = fulltext.Substring(openTagStart + 1, openTagEnd - (openTagStart + 1));
textStartPos = openTagEnd + 1;
closedTagStart = fulltext.IndexOf("</" + tag + ">", textStartPos);
closedTagEnd = closedTagStart + 2 + tag.Length;
textInTags = fulltext.Substring(textStartPos, closedTagStart - (textStartPos));
Вам нужно повторить это дважды из-за ваших вложенных тегов. Но это довольно универсально, потому что вам не нужно заботиться о типах тегов.
Обновлено: Или вы можете попробовать получить синтаксический анализатор XML/HTML для JS, это может быть самый элегантный способ справиться с этим.