Я новичок 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] => 1
[2] => 2
…
)[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 …)
как это сделать?
Вместо того, чтобы использовать регулярные выражения (что медленно), попробуйте разделить вашу строку, используя 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
, то вам нужно знать о нескольких вещах:
{0,20}
марки *
ненужным. То есть то, что вы ищете, .{0,20}
не .*{0,20}
, В противном случае это не имеет смысла.<<>>
от появления в результате, окружив их не захватывающей группой, как это: (?:<<>>)
,?
оператор после операторов, как {x,y}
, *
а также +
, Это сделает сопоставление ленивым.Имея это в виду, мы можем построить следующее регулярное выражение:
preg_match_all('/(.{0,20}?)(?:<?<>>)/', $text, $matches);
Это создаст один пустой элемент в начале массива. Я оставляю это на ваше усмотрение, чтобы избавиться от этого.
Как видите, используя preg_match_all
это намного сложнее, чем с помощью explode()
или же preg_split
, Вот почему я рекомендую вам использовать первый подход.
Других решений пока нет …