簡體   English   中英

PHP正則表達式重復問題

[英]PHP regular expression repetition problem

我有以下字符串:

{slider id="1"} {slide title="title1"} {content} content1{/content} {caption}caption1 {/caption} {/slide} {slide title="title2"} {content} content2{/content} {caption} caption2 {/caption} {/slide} {/slider}

我想用正則表達式來解析它,但是我被困住了。

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);

結果是:

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 
        )

)

我認為問題出在這里:{/ slide} \\ s *)* {/ slider}第二個*在哪里,但我不知道需要使用哪些功能才能獲得正確的結果。

我想在數組中得到這個結果:

1
title1
content1
caption1
2
title2
content2
caption2

UPDATE1:正則表達式必須與字符串中的多個滑塊實例一起使用,例如:

$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}
';

這怎么樣?

根據OP的評論,更新后的答案如下:

$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}
';

preg_match_all('/{slide\s+title="(.*?)"\s*}\s*{content}(.*?){\/content}\s*{caption}(.*?){\/caption}\s*{\/slide}\s*/sm', $body, $sliders, PREG_SET_ORDER);

$new_array = array();

for ($i = 0; $i < count($sliders); $i++) {
    for ($j = 1; $j < count($sliders[$i]); $j++) {
        $new_array[] = $sliders[$i][$j];
    }
}

echo '<pre>'.print_r($new_array,1).'</pre>';

上面產生了以下輸出:

Array
(
[0] => title1
[1] =>  content1
[2] => caption1 
[3] => title2
[4] =>  content2
[5] =>  caption2 
[6] => title1
[7] =>  content1
[8] => caption1 
[9] => title2
[10] =>  content2
[11] =>  caption2 
[12] => title1
[13] =>  content1
[14] => caption1 
[15] => title2
[16] =>  content2
[17] =>  caption2 
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM