I have the following string:
{slider id="1"} {slide title="title1"} {content} content1{/content} {caption}caption1 {/caption} {/slide} {slide title="title2"} {content} content2{/content} {caption} caption2 {/caption} {/slide} {/slider}
I would like to parse it by regular expression, but I'm stuck.
preg_match_all('/{slider\s+id="([0-9]+)"\s*}(\s*{slide\s*title="(.*?)"\s*}\s*{content}(.*?){\/content}\s*{caption}(.*?){\/caption}\s*{\/slide}\s*)*{\/slider}/sm', $body, $sliders);
The result is:
Array
(
[0] => Array
(
[0] => {slider id="1"} {slide title="title1"} {content} content1{/content} {caption}caption1 {/caption} {/slide} {slide title="title2"} {content} content2{/content} {caption} caption2 {/caption} {/slide} {/slider}
)
[1] => Array
(
[0] => 1
)
[2] => Array
(
[0] => {slide title="title2"} {content} content2{/content} {caption} caption2 {/caption} {/slide}
)
[3] => Array
(
[0] => title2
)
[4] => Array
(
[0] => content2
)
[5] => Array
(
[0] => caption2
)
)
I think the problem is around here: {/slide}\s*)*{/slider} Where the second * is, but I don't know what features need to use to get the right result.
I would like to get this result in the array:
1
title1
content1
caption1
2
title2
content2
caption2
UPDATE1: The regular expression must work with multiple slider instances in the string, like:
$body = '
{slider id="1"} {slide title="title1"} {content} content1{/content} {caption}caption1 {/caption} {/slide} {slide title="title2"} {content} content2{/content} {caption} caption2 {/caption} {/slide} {/slider}
{slider id="2"} {slide title="title1"} {content} content1{/content} {caption}caption1 {/caption} {/slide} {slide title="title2"} {content} content2{/content} {caption} caption2 {/caption} {/slide} {/slider}
{slider id="3"} {slide title="title1"} {content} content1{/content} {caption}caption1 {/caption} {/slide} {slide title="title2"} {content} content2{/content} {caption} caption2 {/caption} {/slide} {/slider}
';