php preg_match_all с регулярным выражением, анализ строки. несколько рядов

Я новичок PHP программист.

я серьезная проблема Т_Т ….

использовать php preg_match_all с регулярным выражением,

$ pattern = «/<<>> (. *) {} 0,20? (<<>>) / «;
$ text = <<>> id1<<>> 2<<>> 3<<>> 4<<>> 5<<>> 6<<>> 7<<>> 8<>> 9<<>> 10<<>> 11<<>> 12<<>> 13<<>> 14<<>> 15<<>> 16<<>> 17<<>> 18<<>> 19<<>> 20<<>> 21<<>> «;
$ text. = «<<>> id2<<>> 2<<>> 3<<>> 4<<>> 5<<>> 6<<>> 7<<>> 8<>> 9<<>> 10<<>> 11<<>> 12<<>> 13<<>> 14<<>> 15<<>> 16<<>> 17<<>> 18<<>> 19<<>> 20<<>> 21<<>> «;
$ text. = «<<>> id3<<>> 2<<>> 3<<>> 4<<>> 5<<>> 6<<>> 7<<>> 8<>> 9<<>> 10<<>> 11<<>> 12<<>> 13<<>> 14<<>> 15<<>> 16<<>> 17<<>> 18<<>> 19<<>> 20<<>> 21<<>> «;

preg_match_all ($ pattern, $ text, $ match);

этот результат.

Array (
[0] => Массив ([0] => <<>> id1<<>> 2<<>> 3<<>> 4<<>> 5<<>> 6<<>> 7<<>> 8<>> 9<<>> 10<<>> 11<<>> 12<<>> 13<<>> 14<<>> 15<<>> 16<<>> 17<<>> 18<<>> 19<<>> 20<<>> 21<<>><<>> id2<<>> 2<<>> 3<<>> 4<<>> 5<<>> 6<<>> 7<<>> 8<>> 9<<>> 10<<>> 11<<>> 12<<>> 13<<>> 14<<>> 15<<>> 16<<>> 17<<>> 18<<>> 19<<>> 20<<>> 21<<>><<>> id3<<>> 2<<>> 3<<>> 4<<>> 5<<>> 6<<>> 7<<>> 8<>> 9<<>> 10<<>> 11<<>> 12<<>> 13<<>> 14<<>> 15<<>> 16<<>> 17<<>> 18<<>> 19<<>> 20<<>> 21<<>>
)
[1] => Массив
(
[0] => id1<<>> 2<<>> 3<<>> 4<<>> 5<<>> 6<<>> 7<<>> 8<>> 9<<>> 10<<>> 11<<>> 12<<>> 13<<>> 14<<>> 15<<>> 16<<>> 17<<>> 18<<>> 19<<>> 20<<>> 21<<>><<>> id2<<>> 2<<>> 3<<>> 4<<>> 5<<>> 6<<>> 7<<>> 8<>> 9<<>> 10<<>> 11<<>> 12<<>> 13<<>> 14<<>> 15<<>> 16<<>> 17<<>> 18<<>> 19<<>> 20<<>> 21<<>><<>> id3<<>> 2<<>> 3<<>> 4<<>> 5<<>> 6<<>> 7<<>> 8<>> 9<<>> 10<<>> 11<<>> 12<<>> 13<<>> 14<<>> 15<<>> 16<<>> 17<<>> 18<<>> 19<<>> 20<<>> 21
)
[2] => Массив
(
[0] => <<>>
)
)

Однако, я хочу результат, ниже.

[0] => (

[0] => id1
[1] => 1
[2] => 2

)

[1] => (

[0] => id2
[1] => 1
[2] => 2

)

Как шаблон регулярного выражения, этот результат?

Edit1.

array_filter (preg_split (‘/> /’, $ text));

массив
(
[1] => id1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
[6] => 6
[7] => 7
[8] => 8
[9] => 9
[10] => 10
[11] => 11
[12] => 12
[13] => 13
[14] => 14
[15] => 15
[16] => 16
[17] => 17
[18] => 18
[19] => 19
[20] => 20
[21] => 21
[23] => id2
[24] => 2
[25] => 3
[26] => 4
[27] => 5
[28] => 6
[29] => 7
[30] => 8
[31] => 9
[32] => 10
[33] => 11
[34] => 12
[35] => 13
[36] => 14
[37] => 15
[38] => 16
[39] => 17
[40] => 18
[41] => 19
[42] => 20
[43] => 21
[45] => id3
[46] => 2
[47] => 3
[48] ​​=> 4
[49] => 5
[50] => 6
[51] => 7
[52] => 8
[53] => 9
[54] => 10
[55] => 11
[56] => 12
[57] => 13
[58] => 14
[59] => 15
[60] => 16
[61] => 17
[62] => 18
[63] => 19
[64] => 20
[65] => 21
)

но я хочу

[0] => ([0] => id1 [1] => 1 …)
[1] => ([0] => id2 [1] => 1 …)
[2] => ([0] => id3 [1] => 1 …)

как это сделать?

0

Решение

Альтернативный подход: взорвать вашу строку

Вместо того, чтобы использовать регулярные выражения (что медленно), попробуйте разделить вашу строку, используя explode() функция.

explode('<<>>', $text);

Это создаст пустые элементы в начале и в конце массива. Чтобы избавиться от них, вы можете использовать array_filter:

array_filter(explode('<<>>', $text));

Я заметил, однако, что между 8 и 9 у вас есть <>> (примечание отсутствует <). Если это желательно, и вам нужно иметь дело с такого рода вводом, вы можете использовать preg_split, что позволит вам сделать то же самое, что и explode, но с «множественными» разделителями:

array_filter(preg_split('/<?<>>/', $text));

Оригинальный подход: preg_match_all

Если вы настаиваете на использовании preg_match_all, то вам нужно знать о нескольких вещах:

  1. {0,20} марки * ненужным. То есть то, что вы ищете, .{0,20}не .*{0,20}, В противном случае это не имеет смысла.
  2. Вы можете предотвратить <<>> от появления в результате, окружив их не захватывающей группой, как это: (?:<<>>),
  3. Заботиться о чрезмерная жадность, ты можешь использовать ? оператор после операторов, как {x,y}, * а также +, Это сделает сопоставление ленивым.

Имея это в виду, мы можем построить следующее регулярное выражение:

preg_match_all('/(.{0,20}?)(?:<?<>>)/', $text, $matches);

Это создаст один пустой элемент в начале массива. Я оставляю это на ваше усмотрение, чтобы избавиться от этого.


Как видите, используя preg_match_all это намного сложнее, чем с помощью explode() или же preg_split, Вот почему я рекомендую вам использовать первый подход.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]