Reputation: 1661
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
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]
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
Reputation: 3072
\[element title=(.*) picture=[0-9]+\](.*)(\[caption\](.)*\[\caption\])?\[/element\]
Upvotes: 0