2016-11-02 26 views
2

我试图分裂一个字符串使用PHP preg_split,其中包含[fbes_keep]...[/fbes_keep]形式的标签。正则表达式分割位置前后匹配

正则表达式我已经是(?=\[\/?fbes_(remove|keep)])regex101 link

我输入

[fbes_keep]hello[/fbes_keep][fbes_remove]goodbye[/fbes_remove] 

我正在使用的代码是$fragments = preg_split('@(?=\[\/?fbes_(remove|keep)])@i', $original);

我想是的分裂,以这样的:(其中|字符是分割的,为了可读性而添加了空格)

[fbes_keep] | hello | [/fbes_keep] | [fbes_remove] | goodbye | [/fbes_remove] 

但我发现了劈叉是:

[fbes_keep]hello | [/fbes_keep] | [fbes_remove]goodbye | [/fbes_remove] 

我需要做什么改变吗?

回答

1

你试过$var = explode("|", $myString);

你试图获得“你好”和“再见”值,对吧?在使用效果

+0

的'|'s为不在,原来,他们只是在演示目的的例子。对不起,如果我困惑你。 –

+0

为清晰起见进行了编辑。 –

+0

尝试'preg_match(''[fbes_keep](。*?)[/ fbes_keep]'si“,$ result,$ original);' – Maik

0

使用preg_match_all和遍历更多的组织和灵活性的比赛:

$str = '[fbes_keep]hello[/fbes_keep][fbes_remove]goodbye[/fbes_remove]'; 
    preg_match_all('@([[][^]]*[]])([^[]*)([[]/[^]]*[]])@Ui', $str, $matches); 

    /* 
    // die('<pre>'.print_r($matches,true)); 
    Array 
    (
     [0] => Array 
      (
       [0] => [fbes_keep]hello[/fbes_keep] 
       [1] => [fbes_remove]goodbye[/fbes_remove] 
      ) 

     [1] => Array 
      (
       [0] => [fbes_keep] 
       [1] => [fbes_remove] 
      ) 

     [2] => Array 
      (
       [0] => hello 
       [1] => goodbye 
      ) 

     [3] => Array 
      (
       [0] => [/fbes_keep] 
       [1] => [/fbes_remove] 
      ) 

    ) 
    */ 

更新1

// how many matches you have is here 
    $count_of_matches = count($matches[0]); 

    // to answer your comment question...get the 3 parts for match group 0 
    $match_group = 0; // you also have a match_group 1 
    // loop over them if you like // foreach ($matches[0] as $match_group=>$full_match) { 

    // for now, loop over the match group 0's 3 outputs 
    for ($i=1; $i<4; $i++) { 
     echo $matches[$i][$match_group].', '; 
    } 
    // [fbes_keep], hello, [/fbes_keep], 

    // or access them directly 
    echo "{$matches[1][0]}, {$matches[2][0]}, {$matches[3][0]}"; 

更新2

// here is the full, double loop grabbing all of them 
    foreach ($matches[0] as $match_group=>$full_match) { 
     for ($i=1; $i<4; $i++) { 
     echo $matches[$i][$match_group].', '; 
     } 
     echo '<br>'; 
    } 

    /* yielding 
    [fbes_keep], hello, [/fbes_keep], 
    [fbes_remove], goodbye, [/fbes_remove], 
    */ 
+0

我将如何浏览片段但是一次一个?例如,如果我想循环它们,循环得到'[fbes_keep]','hello','[/ fbes_keep]'等等,一次一个。 –

+0

我正在更新我的答案和答案。 – WEBjuju

+0

您也可以使用PREG_PATTERN_ORDER和http://php.net/preg_match_all将所有匹配组分组。我认为你可能会想要所有的“你好”和“再见”作品,但是这取决于你打算如何使用它们。 – WEBjuju

1

使用与preg_match_allimplode功能如下方法:

$str = '[fbes_keep]hello[/fbes_keep][fbes_remove]goodbye[/fbes_remove]'; 
preg_match_all("/\[\/?[a-z_]+\]|[a-z]+\b/", $str, $matches); 
$result = implode(" | ", $matches[0]); 

print_r($result); 

输出:

[fbes_keep] | hello | [/fbes_keep] | [fbes_remove] | goodbye | [/fbes_remove]