Разбить строку на массив по регулярному выражению - PullRequest
1 голос
/ 21 августа 2009

Мне нужно создать массив путем поиска в строке вхождений '[', за которыми следуют 0 или более символов, а затем ']'.

Моя тестовая строка:

$string="[item 1] [2] [] [item3]";

Все вышеперечисленное должно совпадать.

Я думаю, что регулярное выражение для этого

\[*\]

Но как мне создать массив из строки? Я использую

preg_match_all("\[*\]", $string, $matches);

Ответы [ 3 ]

2 голосов
/ 21 августа 2009
preg_match_all('/\[.*?\]/', $string, $matches);

или

preg_match_all('/\[[^\[\]]*\]/', $string, $matches);

Первый прекращает сопоставление, как только видит закрывающую скобку, но он совпадает с открывающей скобкой, если видит первую То есть он будет соответствовать "[ [foo]", если он присутствует на входе.

Второй более надежный, потому что найдет только правильно сбалансированные квадратные скобки; т.е. они не могут содержать квадратные скобки. Если скобки могут быть вложенными, ни одно регулярное выражение не будет работать; это гораздо более сложная проблема.

1 голос
/ 21 августа 2009

Закрыть:

preg_match_all("!\[.*?\]!", $string, $matches);

, а затем $matches[0] будет содержать строки.

Было внесено три изменения:

  1. Завернутое выражение в! (вы можете использовать / или что угодно);
  2. Это. * Не * (в вашем примере [* говорит "0 или больше ["); и
  3. Это было сделано не жадным с. * ?. Если вы этого не сделаете, вы получите только одно совпадение, содержащее в основном всю строку. Взгляните на Более тонкие моменты регулярных выражений PHP .
0 голосов
/ 21 августа 2009

Попробуйте preg_split ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...