Я пытаюсь сопоставить и заменить сломанный HTML с помощью регулярного выражения, но я сделал пару полных кругов с группировкой и обратными вызовами и квантификаторами. Я изо всех сил стараюсь соответствовать каждому сценарию.
JavaScript, потому что проблема запускается в HTML-редакторе браузера веб-клиента.
Разбитый HTML является конкретным - любой текст между закрывающим LI и закрывающим списком UL или OL, который неправильно сформирован как элемент списка.
Например, этот фрагмент здесь, из большего примера под ним:
</li>
bbb<strong>bbbb</strong><strong>bbb <span style="text-decoration: underline;"><em>bbbbb</em></span></strong>=0==
</ul>
Вот полный пример того, где может существовать проблема:
<ul>
<li>1111</li>
<li>Could be anything here</li>
<li>aaaa</li>
bbb<strong>bbbb</strong><strong>bbb <span style="text-decoration: underline;"><em>bbbbb</em></span></strong>=0==
</ul>
<ol>
<li>more?<li>
<li>echo</li>
</ol>
Это то, что я намереваюсь, чтобы HTML выглядел, используя match + replace.
<ul>
<li>1111</li>
<li>Could be anything here</li>
<li>aaaabbb<strong>bbbb</strong><strong>bbb <span style="text-decoration: underline;"><em>bbbbb</em></span></strong>=0==
</ul>
<ol>
<li>more?<li>
<li>echo</li>
</ol>
Несколько выражений, которые я пробовал, следующие, но в зависимости от этих (или небольших вариантов), я слишком много согласен или не правильно или что-то в этом роде:
/<\/li>.*?<\/[ou]l>/mig
/<\/li>([\s\n]*[\w!\.?;,<:>&\\\-\{\}\[\]\(\)~#'"=/]+[\s\n]*)+<\/[ou]l>/mig
/<\/li>([\s\n]*[^\s\n]+[\s\n]*)+<\/[ou]l>/i
Искал пару дней подряд, не повезло.. Я понимаю, что я, вероятно, спрашивал, что-то ответили сотни раз раньше.
он рекомендовал использовать подход, основанный на dom, для определения html
используя jQuery:
$('ul>:not(li)').wrapAll('<li></li>');
</li>
, что можно сделать с помощью простого текстового редактора иctrl+f
с replace, который не требует никаких шаблонов и не должен испортить ваш HTML.