Выражение регулярного выражения, похожее на шорткоды WordPress

0

Я прочитал другие темы с похожими проблемами. Но никаких конкретных для этого случая - что, если у меня есть короткие коды того же типа, заключенные в основной код

Итак, это короткий код - http://regexr.com/3a1r6

вход

[cigar] [cigar] [cigar] ceva [/cigar] [/cigar] [/cigar] ceva [cigar] [cigar] [cigar] alceva [/cigar] [/cigar] [/cigar]

Тестовое регулярное выражение

\[cigar].*?\[\/cigar\]

Правильный вывод будет -

[cigar] [cigar] [cigar] ceva [/cigar] [/cigar] [/cigar]

не

[cigar] [cigar] [cigar] ceva [/cigar]

Любые решения?

  • 1
    опубликуйте вход и свое регулярное выражение здесь.
  • 0
    это было на той ссылке, но хорошо, хорошо отправленный
Теги:
shortcode

2 ответа

1
Лучший ответ

Просто добавьте отрицательное утверждение, как показано ниже,

\[cigar].*?\[\/cigar\](?!\s*\[\/)

DEMO

(?!\s*\[\/) Отрицательный lookahead утверждает, что за совпадением будет следовать любое, но не одно или несколько пробелов, а затем [/ symbols.

  • 0
    Спасибо @Raj Любое решение для этой строки? [сигара] [сигара] [сигара] ceva [/ сигара] [/ сигара] [/ сигара] [сигара] [сигара] [сигара] alceva [/ сигара] [/ сигара] [/ сигара]?
  • 0
    получается 1 совпадение и должно быть 2
Показать ещё 2 комментария
1

В зависимости от того, что вы делаете, это не имеет значения.

Скажем, я пишу синтаксический анализатор BBCode, и мне приходится иметь дело с:
[b] [b] [b] Triple bold for some reason! [/b] [/b] [/b]

Поэтому у меня есть регулярное выражение, скажем /\[b\](.*?)\[\/b\]/ => "<b>$1</b>"

Если я повторно применяю замену до тех пор, пока она больше ничего не изменит, результатом будет:
<b> <b> <b> Triple bold for some reason! </b> </b> </b>

Что касается браузера, у меня есть три совершенно допустимых вложенных элемента, хотя, когда я разбирал их, я не делал их извне внутрь.


Другая альтернатива - совпадение от последней к первой. Это будет сделано с
/\[b\](.*?)\[\/b\](?!.*\[b\])/

Это будет соответствовать последнему [b] и первому [/b] который следует за ним, другими словами, самой внутренней вложенной паре. Опять же, повторное приложение до тех пор, пока ничего не изменится, приведет к анализу всех пар, но на этот раз они фактически будут разбираться в "правильном" порядке. (Обратите внимание, что указанное выше регулярное выражение может быть медленным или неэффективным на больших входах - используйте с осторожностью)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню