簡體   English   中英

使用正則表達式和PHP preg_match_all在方括號之間獲取字符串

[英]Get a strings between brackets with regular expressions and php preg_match_all

我有幾個帶有自定義宏標簽的文本。 我想解析這些標簽的內容,但是我想以不同的方式對待其中包含參數的標簽。

我需要從這些括號內容中構造有效的URL。

例:

這是我的文字:

{gallery} events / 2016-02-18-Sunny-Sport-Day,single = IMG_0336.jpg,salign = left {/ gallery}

嘿! 艱難而有趣的比賽讓我們度過了美好的一天。 我們的團隊進行了出色的比賽,能夠獲得第二名。

{gallery} events / 2016-02-18-Sunny-Sport-Day {/ gallery}

{gallery}團隊/成員{/ gallery}

因此,我需要提取{gallery}標記之間的字符串的路徑部分,但我不想將它們與諸如“ single = IMG_0336.jpg,salign = left”之類的參數進行匹配,因為它們是分開處理的。

我需要做以下事情:

{gallery} events / 2016-02-18-Sunny-Sport-Day,single = IMG_0336.jpg,salign = left {/ gallery}

變成

第一輸出:events / 2016-02-18-Sunny-Sport-Day

第二個輸出:IMG_0336.jpg

{gallery} events / 2016-02-18-Sunny-Sport-Day {/ gallery}

變成

活動/ 2016-02-18-晴天-運動日

嘗試了以下正則表達式:

/\{gallery\}(.*?)(?!single=)\{\/gallery\}/

但是它始終匹配包括單個參數在內的整個字符串。

為了獲得單個參數的內容,我嘗試了以下操作:

/,single=(.*?),/

這僅適用於單個參數,但我不知道如何將所有內容整合在一起。

結論:

在PHP環境中,我希望有兩個數組作為輸出。 第一個僅包含以下文件夾:

  • 活動/ 2016-02-18-晴天-運動日
  • 團隊成員

第二個數組,由單個文件路徑組成:

  • 活動/2016-02-18-Sunny-Sport-Dayist/IMG_0336.jpg

這樣的東西?

<?php
$str=getstr();
preg_match_all('/\{gallery\}(.*?)\{\/gallery\}/u',$str,$matches);
$parsed=[];
foreach($matches[1] as $match){
    $tmp=[];
    $match=explode(',',$match);
    foreach($match as $tmp2){
        $tmp2=explode("=",$tmp2);
        assert(count($tmp2)<=2);
        if(count($tmp2)>1){
            $tmp[$tmp2[0]]=$tmp2[1];
        }else{
            $tmp[]=$tmp2[0];
        }
    }
    $parsed[]=$tmp;
}
var_dump($parsed);


function getstr():string{
    $str=<<<'STR'
{gallery}events/2016-02-18-Sunny-Sport-Day,single=IMG_0336.jpg,salign=left{/gallery}

Hey there! We had a great day with a tough but funny competition. Our team had a great race and was able to finish in second place.

{gallery}events/2016-02-18-Sunny-Sport-Day{/gallery}

{gallery}team/members{/gallery}
STR;
return $str;
}

$ parsed [0] [0]包含events/2016-02-18-Sunny-Sport-Day

$ parsed [0] [“ single”]包含IMG_0336.jpg

$ parsed [0] [“ salign”]包含left

$ parsed [1] [0]包含events/2016-02-18-Sunny-Sport-Day

$ parsed [2] [0]包含team/members

var_dump的完整輸出為

array(3) {
  [0]=>
  array(3) {
    [0]=>
    string(33) "events/2016-02-18-Sunny-Sport-Day"
    ["single"]=>
    string(12) "IMG_0336.jpg"
    ["salign"]=>
    string(4) "left"
  }
  [1]=>
  array(1) {
    [0]=>
    string(33) "events/2016-02-18-Sunny-Sport-Day"
  }
  [2]=>
  array(1) {
    [0]=>
    string(12) "team/members"
  }
}

此方法將提取所需的子字符串並根據需要准備輸出數據: 模式演示

PHP代碼:( 演示

$str="{gallery}events/2016-02-18-Sunny-Sport-Day,single=IMG_0336.jpg,salign=left{/gallery}

Hey there! We had a great day with a tough but funny competition. Our team had a great race and was able to finish in second place.

{gallery}events/2016-02-18-Sunny-Sport-Day{/gallery}

{gallery}team/members{/gallery}";
preg_match_all('@\{gallery\}([^,]*?)(?:,single=([^,{]+).*?)?\{/gallery\}@',$str,$out);

// Matches array:
var_export($out);

echo "\n\n---\n\n";

// Folders only array:
var_export(array_filter(array_slice($out,1)[0],'strlen'));

echo "\n\n---\n\n";

// Path + Image files array:
foreach($out[2] as $i=>$v){
    if($v){
        $result[]="{$out[1][$i]}/$v";
    }
}
var_export($result);\

輸出:

array (
  0 => 
  array (
    0 => '{gallery}events/2016-02-18-Sunny-Sport-Day,single=IMG_0336.jpg,salign=left{/gallery}',
    1 => '{gallery}events/2016-02-18-Sunny-Sport-Day{/gallery}',
    2 => '{gallery}team/members{/gallery}',
  ),
  1 => 
  array (
    0 => 'events/2016-02-18-Sunny-Sport-Day',
    1 => 'events/2016-02-18-Sunny-Sport-Day',
    2 => 'team/members',
  ),
  2 => 
  array (
    0 => 'IMG_0336.jpg',
    1 => '',
    2 => '',
  ),
)

---
// Folders only array:
array (
  0 => 'events/2016-02-18-Sunny-Sport-Day',
  1 => 'events/2016-02-18-Sunny-Sport-Day',
  2 => 'team/members',
)

---
// Path + Image files array:
array (
  0 => 'events/2016-02-18-Sunny-Sport-Day/IMG_0336.jpg',
)

暫無
暫無

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

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