Regex, как смотреть в будущее и видеть, есть ли другая подходящая конечная часть? - PullRequest
3 голосов
/ 10 февраля 2012

Я использую шаблон регулярных выражений для поиска экземпляров BB-тегов [code] [/ code].(Это в PHP с регулярным выражением перламутрового типа с использованием preg_match / preg_relace / etc)

'~\[code\](.*?)\[\/code\]~is'

Ну, мой вопрос, как я могу сделать так, чтобы кто-то мог напечатать что-то вроде:

[code][code]code here[/code][/code]

Целью этого набора было бы продемонстрировать новичку, как разместить свой код в тегах [code] [/ code].

В настоящее время, если я наберу это, регулярное выражение остановится на 1-м экземпляре«[/ code]» и не продолжайте смотреть вперед, чтобы увидеть 2-й экземпляр «[code]»

Я не могу публиковать изображения, так как я новый пользователь, но вот скриншот с выводом: http://i.imgur.com/t8zNh.png

Я знаю, что в регулярном выражении есть термин, который называется «позитивный взгляд в будущее» и «негативный взгляд в будущее», но я не совсем уверен, что они имеют в виду, или имеют ли они отношение к моей ситуации,Может ли кто-нибудь помочь мне?Спасибо.

РЕДАКТИРОВАТЬ: Извините, но у меня, кажется, не хватает представителя, чтобы +1 что-нибудь.Я очень ценю вашу помощь, и это было так быстро.

Ответы [ 3 ]

2 голосов
/ 10 февраля 2012

Вы можете попробовать этот шаблон

'~\[code\](.*?)(\[\/code\])+~is'
1 голос
/ 10 февраля 2012

Если вы хотите охватить также случай, когда между двумя закрывающими тегами может быть больше кода, вы можете попробовать этот

\[code\].*?\[\/code\](?:(?:(?!\[code\]).)*\[\/code\])?

См. здесь на Regexr

Первая часть \[code\].*?\[\/code\] соответствует от первого открывающего тега до первого закрывающего тега.

Затем следует сложная часть , которая теперь является необязательной .(?:(?:(?!\[code\]).)*\[\/code\])? совпадает с символами, если после них нет открывающего тега до последнего найденного закрывающего тега.

0 голосов
/ 10 февраля 2012

Все, что вы смотрите, это удаление ? в (.*?)

С ? это ленивое совпадение и будет соответствовать как можно меньшему количеству символов, поэтому оно останавливается, когда видит первое [/code]

Без ? это жадное совпадение, оно будет соответствовать как можно большему количеству символов и будет соответствовать тегу внешнего конца.

...