Как получить строку между двумя строками

У меня есть строка, например, эта строка:

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.


3
125
4

Ответы:

Решено

Это определенно не самый чистый, но я бы предложил такое решение для извлечения всех строк в массив:

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, это может быть самый элегантный способ справиться с этим.