使用正则表达式和php preg_match_all

时间:2017-07-14 12:34:44

标签: php regex preg-match-all

我有几个带有自定义宏标签的文本。我想解析这些标签的内容,但我想以不同的方式处理带有参数的标签。

我需要从这些括号内容中构建有效的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环境中,我希望输出两个数组。第一个只包含文件夹:

  • 事件/ 2016年2月18日 - 阳光 - 体育日
  • 团队/成员

和第二个由单个文件路径组成的数组:

  • 事件/ 2016年2月18日 - 阳光 - 体育-Dayist / IMG_0336.jpg

2 个答案:

答案 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',
)
相关问题