2016-11-02 4 views
2

Я пытаюсь разбить строку, используя PHP preg_split, который содержит теги в форме [fbes_keep]...[/fbes_keep].Regex split position до и после матча

Регулярное выражение у меня есть это (?=\[\/?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

try '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] 
      ) 

    ) 
    */ 

UPDATE 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_all и implode функции:

$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] 
Смежные вопросы