2014-09-24 2 views
0

Я сейчас застрял в регулярном выражении. Я пытаюсь извлечь содержимое BB-коды, который имеет дополнительный Params и, возможно, различные обозначения:Регулярное выражение для BBCode с необязательными параметрами

[tag]https://example.com/1[/tag] 
[tag='https://example.com/2'][/tag] 
[tag="http://another-example.com/whatever"][/tag] 
[tag=ftp://an-ftp-host][/tag] 
[tag='https://example.com/3',left][/tag] 
[tag="https://example.com/4",right][/tag] 
[tag=https://example.com/5][/tag] 
[tag=https://example.com/i-need-this-one,right]http://example.com/i-dont-need-this-one[/tag] 

2-й пары могут быть просто влево или вправо, и если это дано, мне нужно URL из первых пары. В противном случае мне нужно, чтобы это было между тегами.

URL-адрес, который может быть обернут в пределах ' или " или без каких-либо из них.

Мой текущий регулярное выражение это:

~\[tag(?|=[\'"]?+([^]"\']++)[\'"]?+]([^[]++)|](([^[]++)))\[/tag]~i

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

Любые предложения?

+0

Можете ли вы выделить отдельно каждый экземпляр и порядок, которые вы предпочитаете соответствовать? Это, вероятно, не так просто, как вы думаете. – sln

+0

Каждый 1-й URL-адрес. Это все. – user2748261

ответ

1

Я внес некоторые изменения, чтобы делать то, что вы хотите. Я включил свой вариант здесь для удобства сравнения:

Yours: http://regex101.com/r/dE4aE4/1

\[tag(?:=[\'"]?(.*)[\'"]?)?]([^]]*)?\[/tag] 

Mine: http://regex101.com/r/dE4aE4/3

\[tag(?:=[\'"]?([^,]*?)(?:,[^]'"]+)?[\'"]?)?]([^\[]+)?\[/tag] 

Обратите внимание, что я изменил немного, чтобы получить URL без комы (,): от (.*) до ([^,]*?)(?:,[^]'"]+)?

Я также исправил содержание: от ([^]]*)? до ([^\[]+)?

+0

Кажется работать. Любая идея, что вызывает эти пустые 2-ые совпадения? И я только заметил, что регулярное выражение на странице является другим, чем тот, который я пробовал, сначала: P – user2748261

+0

Исправлено. Это было внутри содержимого. Изменено это на +, и все сделано. – rcdmk

+0

Спасибо :) Похоже на решение, которое я искал. Но еще одно: я не могу понять, почему первый тег сопоставляется в 2, а не в 1. Будет ли это возможным? – user2748261

Смежные вопросы