2015-07-20 3 views
-1

У меня есть строка, как этотpreg_split с закрывающим тегом

$string = '[c]str1[/c][c]str2[/c][c]str3[/c][c]str4[/c][c]str5[/c]'; 

Я хочу, чтобы разбить его, чтобы получить все strX в массиве

До сих пор мне удалось сделать так

$strarray = preg_split('/\[.](.*?)\[\/.]/', $string, -1, PREG_SPLIT_DELIM_CAPTURE); 

Но в результате я получаю

array (
    0 => '', 
    1 => 'str1', 
    2 => '', 
    3 => 'str2', 
    4 => '', 
    5 => 'str3', 
    6 => '', 
    7 => 'str4', 
    8 => '', 
    9 => 'str5', 
    10 => '', 
) 

Есть ли какой-либо шаблон регулярного выражения, чтобы избавиться от пустых элементов массива напрямую (я не хочу перебирать $ strarray для удаления пустых элементов, если это не единственное решение)?

ответ

3

Вы должны использовать preg_split с PREG_SPLIT_NO_EMPTY флагом:

PREG_SPLIT_NO_EMPTY
Если этот флаг установлен, будут возвращены только непустые куски preg_split().

Код:

$strarray = preg_split('/\[.](.*?)\[\/.]/', $string, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); 

См IDEONE demo

Выход:

Array 
(
    [0] => str1 
    [1] => str2 
    [2] => str3 
    [3] => str4 
    [4] => str5 
) 
0

Использование preg_match_all

preg_match_all('~\[.]\K.*?(?=\[\/.])~', $str, $matches); 

или

preg_match_all('~\[(.)]\K.*?(?=\[\/\1])~', $str, $matches); 

DEMO

Смежные вопросы