Мой шаблон регулярных выражений:
(<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 чем-то.
Ваш катастрофический откат происходит из-за (...|\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.)
Других решений пока нет …