1

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?

wildhaber
  • 1,631
  • 1
  • 18
  • 23

2 Answers2

1

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.

Aziz
  • 20,065
  • 8
  • 63
  • 69
0
\[element title=(.*) picture=[0-9]+\](.*)(\[caption\](.)*\[\caption\])?\[/element\]
Ahmed Jolani
  • 2,872
  • 2
  • 20
  • 24