В тексте есть следующая группа символов:
:arrow_lower_left:arrow_upper_left:black_small_square:
или :arrow_lower_left:
Нужно как-то достать каждое слово без двоеточий через карманы. Пробовал следующее регулярное выражение:
:(?:([a-z_]+):)+
Но в результате сохраняется только последнее слово. Что я делаю не так?
$str = ':arrow_lower_left:arrow_upper_left:black_small_square: ';
preg_match_all(
'/(?<=:) # проверка на наличие двоеточия перед захватывающей скобкой
([a-z_]+) # захват "слова" (можно даже убрать скобки)
(?=:) # проверка на наличие двоеточия после захватывающей скобки
/x',
$str,
$found
);
var_dump($found);
См. также
Всё по существу и ничего лишнего:
$str = ':arrow_lower_left:arrow_upper_left:black_small_square:';
preg_match_all('~:\K[^:]+~', $str, $arr);
var_dump($arr[0]);
Результат:
array (size=3)
0 => string 'arrow_lower_left' (length=16)
1 => string 'arrow_upper_left' (length=16)
2 => string 'black_small_square' (length=18)
Демо PHP
Демо REGEXP
Продвижение своими сайтами как стратегия роста и независимости