wildhaber
wildhaber

Reputation: 1661

RegEx with optional part inside

I'm pretty new to regular expression. Just tried to analyse a "BB-Code" that could do something like this:


Pattern:

\[element title=(.*)picture=(\d+)](.*)(?:\[caption](.*):?\[/caption])?\[/caption].*

Search:

[element title=element title picture=32]Lorem ipsum dolor[caption]Photo by John Doe[/caption][/element]

[element title=element title picture=32]Lorem ipsum dolor[/element]


Well, the caption-part should be optional and both entries should give results. How can I reach this?

Upvotes: 1

Views: 459

Answers (2)

Aziz
Aziz

Reputation: 20705

How about this:

\[element title=(.*)picture=(\d+)\](.*?)(\[caption\](.*)\[/caption\])?\[/element\]

It will match both:

[element title=element title picture=32]Lorem ipsum dolor[caption]Photo by John Doe[/caption][/element]

[element title=element title picture=32]Lorem ipsum dolor[/element]

Example

in PHP, you can use it this way:

$regex = '#\[element title=(.*)picture=(\d+)\](.*?)(\[caption\](.*)\[/caption\])?\[/element\]#i';
$text = '[element title=element title picture=32]Lorem ipsum dolor[caption]Photo by John Doe[/caption][/element]';    

preg_match ( $regex, $text, $match );

print_r( $match );

The array $match will have several elements. Those are the strings that are surrounded by round-brackets ( and ) in the regular expression. One of them is the caption text.

Program execution and output can be seen here http://ideone.com/vQ1T0.

Upvotes: 1

Ahmed Jolani
Ahmed Jolani

Reputation: 3072

\[element title=(.*) picture=[0-9]+\](.*)(\[caption\](.)*\[\caption\])?\[/element\]

Upvotes: 0

Related Questions