regex — PHP preg_split, разделенный одинаковыми символами

Я пытаюсь разбить строку с помощью preg_split. Вот пример строки:
111235622411
Я хочу, чтобы вывод был таким:

$arr[0] = "111";
$arr[1] = "2";
$arr[2] = "3";
$arr[3] = "5";
$arr[4] = "6";
$arr[5] = "22";
$arr[6] = "4";
$arr[7] = "11";

Так что, если есть один и тот же символ один за другим, я хочу, чтобы они были в том же «чанке». Я просто не могу придумать регулярное выражение, которое я должен использовать. Извините, если некоторые термины неверны, потому что прошло уже некоторое время с тех пор, как я кодировал PHP.

1

Решение

я хотел бы использовать preg_match_all():

$string = '111235622411';

preg_match_all('/(.)\1*/', $string, $matches);
var_dump($matches[0]);

\1 ссылается на ранее захваченную группу (.) (любой отдельный символ). Эта функция называется обратная ссылка. Регулярное выражение повторяет ранее подобранный символ — жадный * это означает, что оно соответствует как можно большему числу одинаковых символов, что и требовалось в вопросе.

Выход:

array(8) {
[0]=>
string(3) "111"[1]=>
string(1) "2"[2]=>
string(1) "3"[3]=>
string(1) "5"[4]=>
string(1) "6"[5]=>
string(2) "22"[6]=>
string(1) "4"[7]=>
string(2) "11"}
3

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

Вы можете использовать это регулярное выражение:

(.)(?=\1)\1+|\d

И вместо того, чтобы разделить это, возьмите спички.

$matches = null;
$returnValue = preg_match_all('/(.)(?=\\1)\\1+|\\d/', '111235622411', $matches);

И $matches[0] будет содержать то, что вы хотите. Как сказал @ hek2mgl, вы также можете использовать более простой /(\d)\1*/

DEMO

1

Ниже приведено простое решение, заключающееся в выполнении preg_match_all:

Регулярное выражение в этом случае:

(\d)\1*

Значение регулярного выражения:

  • (\ d): 1-я группа захвата. \ d соответствует цифре [0-9].
  • \ 1 соответствует тому же тексту, что и последний сопоставленный 1-й группе захвата.
  • *: Квантификатор от нуля до неограниченного времени.

PHP-код будет:

$re = "/(\\d)\\1*/";
$str = "111235622411";

preg_match_all($re, $str, $matches);
print_r($matches[0]);

Например, вы можете получить доступ к первой совпадающей группе «111» следующим образом: $ соответствует [0] [0], вторая «2», как эта $ соответствует [0] [1], и так далее. Проверьте здесь демонстрация увидеть рабочий пример.


Надеюсь, это полезно!

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