[英]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環境中,我希望有兩個數組作為輸出。 第一個僅包含以下文件夾:
第二個數組,由單個文件路徑組成:
這樣的東西?
<?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.