我有几个带有自定义宏标签的文本。我想解析这些标签的内容,但我想以不同的方式处理带有参数的标签。
我需要从这些括号内容中构建有效的URL。
示例:
这是我的文字:
{画廊}事件/ 2016年2月18日 - 阳光 - 体育日,单= IMG_0336.jpg,SALIGN =左{/画廊}
嘿那里!我们度过了一个艰难但有趣的竞争。我们的 球队有一场伟大的比赛,并且能够获得第二名。{画廊}事件/ 2016年2月18日 - 阳光 - 体育日{/画廊}
{画廊}小组/成员{/画廊}
所以我需要在{gallery}标签之间提取字符串的路径部分,但我不想匹配那些参数,例如“single = IMG_0336.jpg,salign = left”,因为这些是单独处理的。
我需要做以下事情:
{画廊}事件/ 2016年2月18日 - 阳光 - 体育日,单= IMG_0336.jpg,SALIGN =左{/画廊}
变为
首先输出:events / 2016-02-18-Sunny-Sport-Day
第二个输出:IMG_0336.jpg
和
{画廊}事件/ 2016年2月18日 - 阳光 - 体育日{/画廊}
变为
事件/ 2016年2月18日 - 阳光 - 体育日
试过以下正则表达式:
/\{gallery\}(.*?)(?!single=)\{\/gallery\}/
但它总是匹配整个字符串,包括单个参数。
要获取单个参数的内容,我尝试了以下内容:
/,single=(.*?),/
这只对单个参数有效,但我不知道如何将所有内容组合在一起。
结论:
在PHP环境中,我希望输出两个数组。第一个只包含文件夹:
和第二个由单个文件路径组成的数组:
答案 0 :(得分:0)
这样的事情?
<?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] [&#34; single&#34;]包含IMG_0336.jpg
$ parsed [0] [&#34; salign&#34;]包含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"
}
}
答案 1 :(得分:0)
此方法将提取您所需的子字符串并按照您的要求准备输出数据:Pattern Demo
PHP代码:(Demo)
$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',
)