Катастрофическая ошибка возврата при использовании шаблона регулярных выражений

Мой шаблон регулярных выражений:

 (<span style="color:green">?(\s*|\w*|\S*)*<li>)(?! ?\s*<\/span>)

Всякий раз, когда я пытаюсь ввести как:

 <span style="color:green"> anything <li>

Это работает нормально, но всякий раз, когда возникает последнее условие, то есть всякий раз, когда за тегом li следует закрывающий тег span, он выдает ошибку:
Пример, когда мой ввод:

<span style="color:green"> anything <li></span>

Какова реальная проблема в моем образце?
Вместо: (?!? \ S *</ span>) Я также попробовал:

 ^(</span>)

но такая же ошибка происходит. Я буду встраивать его в PHP.

Короче говоря, мне нужно сделать следующее: всякий раз, когда открывающий тег li находится после открывающего тега span, а закрывающий тег span отсутствует сразу после тега li, мне нужно заменить свой тег li чем-то.

-2

Решение

Ваш катастрофический откат происходит из-за (...|\w*|\S*)*<, принимать "an item", В позиции 0 регулярное выражение должно проверить все эти возможности

<
()<
(\w)<
(\w\w)<
(\w\w\w)
()<
(\S)<
(\S\S)<
(\S\S\S)
()()<
()(\w)<
()(\w\w)<
()(\w\w\w)
()()<
()(\S)<
()(\S\S)<
()(\S\S\S)
(\w)()<
(\w)(\w)<
(\w)(\w\w)
(\w)()<
(\w)(\S)<
(\w)(\S\S)
(\w\w)()<
(\w\w)(\w)
(\w\w)()<
(\w\w)(\S)
(\w\w\w)()
(\w\w\w)()
()()<
()(\w)<
()(\w\w)<
()(\w\w\w)
()()<
()(\S)<
()(\S\S)<
()(\S\S\S)
(\S)()<
(\S)(\w)<
(\S)(\w\w)
(\S)()<
(\S)(\S)<
(\S)(\S\S)
(\S\S)()<
(\S\)(\w)<
(\S\S)()<
(\S\S)(\S)
(\S\S\S)()
(\S\S\S)()
()()()<
()()(\w)<
()()(\w\w)<
()()(\w\w\w)
()()()<
()()(\S)<
()()(\S\S)<
()()(\S\S\S)
()(\w)()<
()(\w)(\w)<
()(\w)(\w\w)
()(\w)()<
()(\w)(\S)<
()(\w)(\S\S)
()(\w\w)()<
()(\w\w)(\w)
()(\w\w)()<
()(\w\w)(\S)
()(\w\w\w)()
()()()<
()()(\w)<
()()(\w\w)<
()()(\w\w\w)
()()()<
()()(\S)<
()()(\S\S)<
()()(\S\S\S)
()(\S)()<
()(\S)(\w)<
()(\S)(\w\w)
()(\S)()<
()(\S)(\S)<
()(\S)(\S\S)
()(\S\S)()<
()(\S\)(\w)<
()(\S\S)()<
()(\S\S)(\S)
()(\S\S\S)()
(\w)()()<
(\w)()(\w)<
(\w)()(\w\w)
(\w)()()<
(\w)()(\S)<
(\w)()(\S\S)
(\w)(\w)()<
(\w)(\w)(\w)
(\w)(\w)()<
(\w)(\w)(\S)
(\w)(\w\w)()
(\w)(\w\w)()
(\w)()()<
(\w)()(\w)<
(\w)()(\w\w)
(\w)()()<
(\w)()(\S)<
(\w)()(\S\S)
(\w)(\S)()<
(\w)(\S)(\w)
(\w)(\S)()<
(\w)(\S)(\S)
(\w)(\S\S)()
(\w)(\S)(\w)
(\w)(\S\S)()
(\w\w)()()<
(\w\w)()(\w)
(\w\w)()()<
(\w\w)()(\S)
(\w\w)(\w)()
(\w\w)(\w)()
(\w\w)()()<
(\w\w)()(\w)
(\w\w)()()<
(\w\w)()(\S)<
(\w\w)(\S)()
(\w\w)(\S)()
(\w\w\w)()()
(\S)()()<
(\S)()(\w)<
(\S)()(\w\w)
(\S)()()<
(\S)()(\S)<
(\S)()(\S\S)
(\S)(\w)()<
(\S)(\w)(\w)
(\S)(\w)()<
(\S)(\w)(\S)
(\S)(\w\w)()
(\S)(\w\w)()
(\S)()()<
(\S)()(\w)<
(\S)()(\w\w)
(\S)()()<
(\S)()(\S)<
(\S)()(\S\S)
(\S)(\S)()<
(\S)(\S)(\w)
(\S)(\S)()<
(\S)(\S)(\S)
(\S)(\S\S)()
(\S)(\S)(\w)
(\S)(\S\S)()
(\S\S)()()<
(\S\S)()(\w)
(\S\S)()()<
(\S\S)()(\S)
(\S\S)(\w)()
(\S\S)(\w)()
(\S\S)()()<
(\S\S)()(\w)
(\S\S)()()<
(\S\S)()(\S)
(\S\S)(\S)()
(\S\S)(\S)()
(\S\S\S)()()
...

чтобы устранить "an " как возможный матч. (Я, наверное, где-то напутал, но вы поняли.)

Также обратите внимание, что \s|\S является . (кроме перевода строки). Но то, что вы действительно хотите, это «не начало тега»: [^<]*</li>, Таким образом, чтобы устранить "an " в качестве кандидата, движку регулярных выражений нужно только проверить это:

<
[^<]<
[^<][^<]<

(Также +1 к комментарию Стрибижева: используйте библиотеку обработки HTML для обработки HTML.)

1

Другие решения

Других решений пока нет …